9148c358d0
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를 Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류. - 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로 자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거, 동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거. - 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming, Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business, Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로, 나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는 title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백). 원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지. - 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서. - 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는 지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지. - Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경. - 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
4.3 KiB
4.3 KiB
id, title, category, status, source_trust_level, verification_status, created_at, updated_at, tags, tech_stack, applied_in, aliases
| id | title | category | status | source_trust_level | verification_status | created_at | updated_at | tags | tech_stack | applied_in | aliases | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| testing-fuzzing-patterns | Fuzzing — 무작위 / 변형 / coverage 기반 | Coding | draft | B | conceptual | 2026-05-09 | 2026-05-09 |
|
|
|
Fuzzing
보안 / 안정성 강력. 무작위 / 변형 input → crash / hang / 잘못된 결과 찾기. Coverage-guided 가 진화 — 새 path 보면 keep. Parser / decoder / network 입력에 강.
📖 핵심 개념
- Random fuzzing: 완전 random.
- Mutation: seed 변형 (bit flip, splice).
- Coverage-guided: 새 path 가는 input 보존.
- Sanitizer: ASAN, UBSAN 같이 — undefined behavior 잡음.
💻 코드 패턴
Go fuzzing (built-in)
// parser_test.go
package parser
import "testing"
func FuzzParse(f *testing.F) {
f.Add([]byte(`{"a":1}`)) // seed
f.Add([]byte(`{}`))
f.Fuzz(func(t *testing.T, data []byte) {
result, err := Parse(data)
if err != nil { return }
// 속성: parse 성공 → reformat → 같은 결과
rendered := Format(result)
result2, err2 := Parse(rendered)
if err2 != nil || !equal(result, result2) {
t.Fail()
}
})
}
go test -fuzz=FuzzParse -fuzztime=10s
Rust fuzzing (cargo-fuzz)
// fuzz/fuzz_targets/parse.rs
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
let _ = parser::parse(data);
});
cargo fuzz run parse
TS fuzzing (jazzer.js)
import { instrument } from '@jazzer.js/instrumentor';
export function fuzz(data: Buffer) {
try {
JSON.parse(data.toString('utf8'));
} catch (e) {
if (e instanceof SyntaxError) return; // expected
throw e; // unexpected — fuzz 가 crash
}
}
jazzer fuzz.ts --fuzz=fuzz
Property + fuzzing
// fast-check 도 일종의 fuzzing
import fc from 'fast-check';
fc.assert(fc.property(fc.uint8Array(), (data) => {
const parsed = myParse(data);
if (parsed) {
const rendered = myFormat(parsed);
expect(myParse(rendered)).toEqual(parsed);
}
}), { numRuns: 10000 });
Corpus (seed)
fuzz/corpus/
empty
simple.json
large.json
malformed.json
edge_cases/
→ Fuzzer 가 시드에서 시작하여 변형.
CI fuzzing (Go example)
- name: Fuzz parse
run: go test -fuzz=FuzzParse -fuzztime=2m -run=^$ ./parser/
⚠️ 큰 fuzz time = 느림. PR 마다 X — nightly.
OSS-Fuzz (Google)
- Open source: 자동 fuzzing 무료.
- C/C++/Rust/Go/Python/Java/JS.
- 발견된 버그 reports + auto regression test.
Fuzz crash 분석
# Fuzzer 가 crash 한 input 저장
testdata/fuzz/FuzzParse/abc123 # 특정 input 재현
go test -run=FuzzParse/abc123 # 그 input 만 실행
→ Shrinking 으로 minimal reproduce.
보안 use case
parser: SQL injection / command injection 입력
network: 잘못된 packet → buffer overflow
crypto: 잘못된 signature / key
file format: pdf / image / zip 파싱
Sanitizer (C/C++/Rust)
# AddressSanitizer
clang -fsanitize=address fuzz.c
# UndefinedBehaviorSanitizer
clang -fsanitize=undefined
# 결합 = 강
🤔 의사결정 기준
| 적합 | 부적합 |
|---|---|
| Parser / decoder | Pure 비즈니스 |
| Network input handler | UI |
| File format | DB query |
| Crypto | Test framework |
| Compiler / interpreter | 단순 fetch wrapper |
| 보안 critical | Internal-only API |
❌ 안티패턴
- No corpus: 발견 느림. 의미 있는 seed.
- Crash 후 안 fix: 기록만, 다시 발생.
- CI 매 PR fuzz: 느림. nightly / weekly.
- Random 만 (coverage 무시): 같은 path 만.
- Fuzz target 가 setup 비싸 (DB): 매 input 마다 setup. mock.
- External call (HTTP): random — 외부 영향. mock.
- Deterministic input 만 OK 가정: 시간 / random / file 영향 — control.
🤖 LLM 활용 힌트
- Parser / decoder = 자연.
- Property + fuzzing 결합.
- OSS-Fuzz 같은 자동 plat 활용.