harness-writing
작성자 trailofbitsharness-writing은 원시 바이트를 대상 시스템의 의미 있는 재현 가능한 테스트로 바꾸는 퍼징 하네스를 설계하도록 돕습니다. Code Generation 작업에서 새 퍼즈 타깃이 필요하거나 커버리지, 안정성, 버그 발견 능력을 높이고 싶을 때 이 harness-writing 스킬을 사용하세요. 결정적 입력 파싱, 올바른 호출 순서, 재현 가능한 크래시에 중점을 둡니다.
이 스킬은 78/100점으로, 퍼징 하네스 작성에 대한 실용적인 안내를 찾는 사용자에게 충분히 유력한 후보입니다. 저장소에는 실제로 동작하는, 템플릿용이 아닌 기법 가이드가 담겨 있으며, 내용의 분량과 적용 가능성이 충분하고 구조도 잘 잡혀 있어 단순한 프롬프트보다 에이전트가 더 잘 활용할 수 있습니다. 다만 설치 명령이나 도입을 자동화해 주는 지원 스크립트는 없으므로, 문서를 직접 읽고 적용해야 한다는 점은 염두에 두어야 합니다.
- 명확한 사용 사례: 프론트매터에 새 퍼즈 타깃을 만들거나 기존 하네스 코드를 개선하는 데 적용된다고 적혀 있습니다.
- 충분한 실무 콘텐츠: 본문이 크고 구조화되어 있으며, 여러 헤딩과 코드 블록, 명시적인 워크플로/제약 신호가 포함되어 있습니다.
- 에이전트가 트리거하기 좋음: harness, SUT, entry point, 결정적 동작 같은 핵심 개념을 정의해 추측의 여지를 줄여 줍니다.
- 설치 명령과 지원 파일이 없어, 도입은 도구 지원보다 문서 중심으로 보입니다.
- 설명이 짧아, 정확한 적합성과 워크플로 세부사항을 파악하려면 전체 SKILL.md를 확인해야 할 수 있습니다.
harness-writing 개요
harness-writing 스킬은 원시 바이트를 대상 시스템에 대해 의미 있고 재현 가능한 테스트로 바꾸는 퍼징 하네스를 설계하는 데 도움을 줍니다. 이미 대상 라이브러리나 API가 있고, 입력을 받아 그냥 반환하는 수준이 아니라 실제로 깊은 코드 경로까지 도달하는 하네스가 필요할 때 가장 유용합니다. Code Generation에 harness-writing을 사용할지 판단할 때 핵심 질문은, 퍼징에 대한 일반론이 아니라 구조화된 퍼즈 타깃 로직이 필요한가입니다.
harness-writing은 무엇을 위한 것인가
새 퍼즈 타깃을 만들거나, 커버리지·안정성·버그 발견 측면에서 기존 타깃을 개선해야 할 때 harness-writing 스킬을 사용하세요. 이 스킬은 퍼징된 바이트를 안전하게 처리 가능한 유효한 호출, 상태 전이, 경계 조건으로 매핑하는 실무에 초점을 맞춥니다.
일반적인 프롬프트와 다른 점
일반적인 프롬프트는 퍼징을 개괄적으로 설명할 수 있지만, harness-writing 스킬은 하네스 설계를 위한 더 촘촘한 작업 흐름을 제공합니다. 입력을 어떻게 파싱할지, 어떤 연산을 선택할지, 비결정성을 어떻게 피할지, 크래시를 어떻게 재현 가능하게 유지할지까지 다룹니다. 그래서 결과물이 바로 실행 가능한 형태여야 하는 Code Generation 작업에 더 적합합니다.
가장 잘 맞는 사용자와 프로젝트
이 스킬은 보안 엔지니어, 퍼징 실무자, 라이브러리 유지관리자, 그리고 C/C++ 같은 저수준 타깃용 테스트 인프라를 생성하는 에이전트에 잘 맞습니다. 커버리지, 크래시 트리아지, API 수준의 정확성을 중요하게 본다면 특히 유용합니다. 반대로, 코드를 작성할 필요 없이 퍼징 개념만 넓게 알고 싶다면 적합도가 떨어집니다.
harness-writing 사용 방법
설치하고 올바른 파일 열기
harness-writing install의 경우, 일반적인 스킬 워크플로로 스킬을 skills 세트에 추가한 뒤 SKILL.md를 먼저 여세요. 가장 빨리 맥락을 파악하려면, 코드를 생성하기 전에 하네스 설계 방식, 적용 시점, 간단한 참고 자료를 설명하는 섹션부터 읽는 것이 좋습니다. 이 repo에서는 SKILL.md가 핵심 स्रोत이며, 추가로 대조해야 할 보조 스크립트나 참고 폴더는 없습니다.
목표를 주고, 목표만 주지 말기
좋은 harness-writing usage를 위해서는 퍼징하려는 정확한 API나 컴포넌트, 언어, 입력 표면을 구체적으로 설명하세요. 좋은 입력 예시는 다음과 같습니다: “ParseMessage(const uint8_t*, size_t)를 노출하고 파일 I/O는 피해야 하는 C++ 파서 라이브러리용 퍼즈 하네스를 작성해 주세요.” 약한 입력 예시는 다음과 같습니다: “내 앱용 퍼즈 하네스를 만들어 주세요.” 이 스킬은 진입점이 무엇을 호출해야 하는지, 어떤 동작이 결정적으로 유지돼야 하는지 알 때 가장 잘 작동합니다.
대략적인 아이디어를 완전한 프롬프트로 바꾸기
유용한 harness-writing guide 프롬프트에는 보통 다음이 포함됩니다:
- 대상 이름과 언어
- 알고 있다면 퍼징 엔진 또는 프레임워크
- 테스트할 공개 함수, 생성자, 프로토콜
- 네트워크 접근, 파일시스템 쓰기, 전역 상태 같은 금지되는 부작용
- 알려진 엣지 케이스, 상태 의존 동작, 크래시 이력
- 단일 작업 하네스가 필요한지, 다중 작업 하네스 로직이 필요한지
이 정도 구조를 주면 스킬이 아키텍처를 추측하지 않고 하네스 형태를 고르는 데 도움이 됩니다.
더 나은 결과를 위한 실전 워크플로
먼저 하네스 형태를 요청한 뒤, 그다음에 세부 조건을 추가하는 방식으로 진행하세요. 예를 들어 첫 버전의 하네스를 요청한 다음, 결정성 유지, 입력 분할, 더 깊은 경로 커버리지 같은 제약을 후속으로 붙일 수 있습니다. 첫 버전이 너무 얕다면, 파싱 로직을 재구성하거나, 유효한 연산 범위를 넓히거나, 기본 상태에 대한 가정을 줄이도록 요청하세요. Code Generation에서는 이 두 단계 방식이 큰 프롬프트 하나로 끝내는 것보다 더 나은 하네스를 만드는 경우가 많습니다.
harness-writing 스킬 FAQ
harness-writing은 퍼징 전문가만을 위한 것인가요?
아닙니다. harness-writing 스킬은 대상 API를 알고 있고 구조화된 하네스가 필요한 초보자에게도 도움이 됩니다. 다만 시스템 테스트 대상을 분명하게 설명할 수 있을 때 가장 가치가 큽니다. 진입점을 이름으로 말할 수 없거나 입력이 어떻게 소비되어야 하는지 설명할 수 없다면 결과는 훨씬 약해집니다.
harness-writing은 일반 코드 프롬프트와 어떻게 다른가요?
일반 프롬프트도 하네스처럼 보이는 코드 조각을 만들 수는 있지만, harness-writing은 퍼징 코드를 실제로 유용하게 만드는 핵심 문제, 즉 결정성, 커버리지, 상태 처리, 유효 입력 디코딩에 초점이 맞춰져 있습니다. 그래서 목표가 샘플 코드가 아니라 실제 퍼즈 타깃인 harness-writing for Code Generation에 더 적합합니다.
언제 이 스킬을 쓰지 말아야 하나요?
퍼징 개념에 대한 넓은 입문이 필요하거나, 프로젝트가 자동 입력 기반 테스트를 받을 준비가 안 됐거나, 안정적인 API를 통해 타깃을 자극할 수 없는 경우에는 사용하지 마세요. 또한 주된 문제가 하네스 설계가 아니라 테스트 환경 설정일 때도 도움은 제한적입니다.
repo에서는 무엇부터 읽어야 하나요?
먼저 SKILL.md를 읽고, 이어서 핵심 개념과 적용 시점을 설명하는 섹션을 보세요. 이 repository는 규모가 작기 때문에, 추가 파일을 찾아다니기보다 하네스 작성 로직 자체를 이해하는 데서 핵심 가치를 얻을 수 있습니다.
harness-writing 스킬 개선 방법
대상 형태와 제약을 먼저 분명히 제시하기
품질이 가장 크게 좋아지는 지점은, 퍼징하려는 정확한 함수·객체·프로토콜 경계를 이름으로 지정하는 것입니다. 언어, 예상 입력 타입, 그리고 호출 간 유지돼야 하는 상태가 있으면 함께 넣으세요. 예를 들어 “C++에서 JSON 파서 생성자를 퍼징하되, 모든 테스트 케이스는 결정적이어야 하고 메모리 안에서만 실행되게 해 주세요”는 일반적인 요청보다 훨씬 유용합니다.
컴파일되는 하네스가 아니라 커버리지를 요청하기
흔한 실패 유형은 컴파일은 되지만 코드 경로 하나만 건드리는 하네스입니다. harness-writing을 개선하려면, 하네스가 여러 동작에 어떻게 도달하는지, 잘못된 초기화를 어떻게 피하는지, 크래시를 어떻게 재현 가능하게 유지하는지 설명해 달라고 요청하세요. 이미 도달하기 어려운 분기가 있다면 직접 언급해 두면, 그 분기를 중심으로 하네스를 맞출 수 있습니다.
잘못된 입력 처리와 상태를 반복적으로 점검하기
첫 초안 이후에는 하네스가 입력을 과도하게 거부하지 않는지, 반복 실행 사이에 상태를 누수하지 않는지, 숨겨진 기본값에 의존하지 않는지 확인하세요. 문제가 있다면 결정성을 유지하면서 유효한 연산 커버리지를 넓히는 방향으로 수정 요청을 하세요. 특히 여러 생성자, 중첩 파서, 상태 의존 API가 있는 라이브러리에서는 harness-writing usage에서 이 점이 매우 중요합니다.
첫 초안을 다음 프롬프트의 재료로 쓰기
harness-writing skill 출력물을 개선하는 가장 좋은 방법은 첫 하네스를 기준선으로 삼고, 놓친 부분을 중심으로 다듬는 것입니다. 예를 들면 더 깊은 분기, 더 엄격한 부작용 제한, 더 명확한 입력 분할 같은 부분입니다. 생성된 코드와 대상 API를 함께 공유하면, 다음 단계에서는 추측을 줄이고 더 신뢰할 수 있는 퍼즈 타깃을 만들 수 있습니다.
