Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/gadievron/honeyslop
Defensive ToolsStatic AnalysisVulnerability AnalysisCode AnalysisThreat IntelligenceSupply Chain SecurityMisconfigurationLearning & EducationIncident Response
GitHubgadievron/honeyslop

honeyslop

환각('슬롭') 취약점 보고서를 신속하게 분류하기 위한 코드 카나리아

97103개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기

honeyslop - AI 환각("슬롭") 취약점 보고를 신속히 선별하기 위한 코드 카나리아

HoneySlop

honeyslop은 AI 환각("슬롭") 및 검증되지 않은 취약점 보고로 넘쳐나는 오픈소스 프로젝트를 위한 코드 카나리아, 즉 유인책(decoy)입니다. 이러한 적대적 노이즈 주입을 통해 슬롭 스캐너가 카나리아를 입력으로 받아들인 뒤, 이를 기반으로 취약점 "보고서"를 생성합니다. 그 보고서는 스스로 슬롭임을 드러내므로, grep 한 번으로 종결할 수 있습니다.

이것은 농담 삼아 vibe-coding으로 만든 빠른 PoC(프로덕션 등급 아님)입니다. Claude Code 기반 자율 공격/방어 에이전트인 raptor에서 우리 자신도 슬롭 보고를 받았기 때문입니다. 재미있을 거예요!

코드 카나리아는 익숙한 선별 신호(예: 테스트 파일에서의 탐지, 예제 시크릿, 존재하지 않는 경로)를 의도적인 표식, 즉 유인책으로 확장한 것입니다. 테스트에서 이러한 카나리아는 슬롭을 식별하는 데 충분히 효과적이지만, 더 개선할 수 있습니다(실제 코드에 삽입하거나, 함수/파일/디렉터리 이름을 덜 암시적으로 만들거나, 새 코드처럼 정기적으로 재생성하는 등).

작성자: Gadi Evron (@gadievron), John Cartwright (@grokjc), Daniel Cuthbert (@danielcuthbert), Michal Kamensky (@kamenskymic, 프로젝트 이름을 지어준 공로를 인정합니다).

사용에 따른 책임은 본인에게 있습니다. 이 코드를 프로덕션에 붙여넣는다면 그것은 본인 책임입니다. 아래 면책 조항을 참조하세요.

선별 규칙

들어오는 각 보고서에 대해 다음 순서로 처리합니다:

  1. 보고서에서 카나리아 UUID를 grep으로 찾으면 → 종결. (UUID는 언어별로 있으며, 각 카나리아 파일에는 정확히 하나씩 포함됩니다.)
  2. 카나리아 전용 함수 이름(zqx_tarnish_v3, zqxTarnishV3, _validate_pep_440_plus; F+G를 비공개로 채택한 경우 handle_*_request도 포함)을 grep으로 찾으면 → 종결. (Rust는 Python과 동일한 zqx_tarnish_v3 스네이크 케이스 이름을 사용합니다. Go는 JS 이름과 동일한 zqxTarnishV3를 사용합니다.)
  3. CVE-2025-99919(가짜)을 grep으로 찾으면 → 종결.
  4. 인용된 함수가 트리에 존재하지 않으면 → "존재하지 않음".
  5. B/D의 memcpy/경계 관련 주장의 경우: 보고자에게 자신의 PoC가 인용된 줄의 특정 가드(guard)를 어떻게 우회하는지 단계별로 설명해 달라고 요청하세요. AI 후속 질문에는 답할 수 없지만, 인간은 답할 수 있습니다.

단계

두 가지 유형의 카나리아:

  • 스캐너-플래그 (A, B, C, D, E 단계) — 스캐너를 작동시켜 슬롭 보고가 실제 코드 대신 카나리아에 쌓이게 합니다.
  • 리소스-낭비 (F + G 단계, 함께) — 에이전트형 LLM 스캐너가 최대 비용으로 전체 반복 예산을 소진하도록 실행합니다.

각 단계가 취약해 보임에도 불구하고 어떻게 비활성 상태를 유지하는지는 안전 모델을 참조하세요.

안전 모델

카나리아 코드 파일은 의도적으로 그럴듯한 더 이상 사용되지 않는(deprecated) 모듈처럼 읽히도록 작성되었습니다. 주석이나 식별자에 "canary", "honeypot", "tripwire" 같은 표현이 전혀 없습니다. 이렇게 해야 파일이 스캐너에게 스스로 정체를 드러내지 않지만, 그만큼 이 파일들이 안전한 이유에 대한 문서는 각 파일의 docstring 대신 여기에 존재합니다. 카나리아를 검토하거나 교체할 때 아래의 모든 계층이 그대로 유지되는지 확인하세요.

이러한 파일들은 취약한 형태의 코드입니다. 일부(예: python/session_restore.py의 pickle.loads, c/tls_heartbeat.c의 경계 없는 memcpy)는 도달 가능하다면 실제로 악용될 수 있습니다. 이것이 의도된 설계입니다. 스캐너가 싱크를 탐지하는 것이 핵심이며, 아래 계층들은 스캐너의 신호가 아니라 실행을 차단합니다. 패턴 기반 스캐너(grep, semgrep, LLM 기반 슬롭 파이프라인 — 주요 위협 모델)는 소스를 텍스트로 읽고 런타임 도달 가능성과 무관하게 결과를 표면화합니다. 빌드 통합형 C 스캐너(CodeQL 기본, clang-static-analyzer)는 컴파일된 파일만 보므로 빌드되지 않은 C 카나리아는 이들에게 보이지 않습니다. 슬롭 생성기가 압도적으로 빌드가 아닌 소스를 읽기 때문에 이는 수용 가능한 트레이드오프입니다.

A 및 E 단계 (Python + JS)

다섯 개의 독립적인 계층이 이 파일들을 비활성 상태로 유지합니다:

  1. 최상위 raise ImportError / throw new Error — 일반적인 import / require는 어떤 정의가 바인딩되기 전에 중단됩니다.
  2. 모든 def/함수가 if False: / if (false) 아래에 위치 — 1번 계층이 우회되더라도 이름이 런타임 네임스페이스에 들어가지 않습니다.
  3. 빈 export — Python: __all__: list[str] = [] (star-import는 아무것도 내보내지 않음). JS: module.exports = {} (CommonJS 사용자는 빈 객체를 받음).
  4. 시볼레스 함수의 트리 내 호출자 0개 (zqx_tarnish_v3, zqxTarnishV3, _validate_pep_440_plus). 이들 중 하나를 인용하는 보고서는 스스로 슬롭임을 드러냅니다.
  5. 배포 격리 — 채택자는 sdist / wheel / Docker / SAST에서 카나리아 경로를 제외합니다 (SECURITY.md.template 및 참조).

E 단계는 여섯 번째 계층을 추가합니다: 치명적 역추적 정규식은 모듈 범위에서 re.compile / new RegExp에 전달되지 않고 문자열 리터럴로만 저장됩니다. 1번 계층을 제거하는 하네스(harness)조차 컴파일된 역추적 엔진을 트리거할 수 없습니다.

스캐너는 AST를 따라 raise / throw를 지나 데드 블록까지 탐색하므로 싱크는 여전히 발견 항목으로 표면화됩니다 — 이것이 의도된 동작입니다.

B 단계 (C buffer_ops.c)

안전성은 구조적입니다 — 각 형태에는 증명(proof)이 함께 있습니다:

  • bufops_copy_banner — src는 문자열 리터럴이고, n = sizeof(literal)이며, _Static_assert가 대상 크기에 고정합니다.
  • bufops_copy_bounded — memcpy 바로 앞 줄의 if (n > dst_cap) n = dst_cap;이 CWE-787 주장을 불가능하게 만듭니다. C17 memcpy(dst, NULL, 0) UB를 피하기 위해 n == 0에서 단락(short-circuit)됩니다.
  • bufops_copy_truncating — n <= dst_cap - 1, dst[n]은 최대 dst_cap - 1까지만 접근합니다. dst_cap == 0이면 조기 반환합니다.

추가 격리: 모든 함수는 static(외부 링크 없음)이며 파일은 어떤 빌드 대상에도 추가되지 않습니다.

D 단계 (C heartbeat.c + sat.h)

하트블리드 실루엣(uint16_t payload_len → malloc(1+2+payload_len+16) → memcpy)은 계층화된 가드로 무력화됩니다:

  • 모든 헤더/트레일러 예산 계산에 포화 뺄셈(saturating subtraction) sat_sub 사용 (래핑 없음).
  • 프레임 필드는 진입 시 const 지역 변수에 캐시 — TOCTOU 및 시그널 핸들러 UB 창을 차단.
  • 리더 구조체와 해당 버퍼에 대한 NULL 검사.
  • _Static_assert(SIZE_MAX - 19 >= UINT16_MAX, ...)는 malloc 크기가 size_t를 오버플로할 수 없음을 증명합니다.
  • payload_len > 0 단락 검사는 빈 페이로드에서 memcpy(dst, NULL, 0) UB를 방지합니다.
  • parse_heartbeat와 read_u16_be는 static이며 파일은 어떤 빌드 대상에도 링크되지 않습니다.

인용된 줄의 특정 가드를 검토하지 않고 parse_heartbeat의 OOB 읽기/쓰기를 주장하는 보고서는 악용 가능성을 검증하지 않은 것입니다 — 선별 규칙 5번으로 종결하세요.

c/tls_heartbeat.c는 동일한 실루엣의 변형으로, 의도적으로 가드 없이 유지됩니다: process_heartbeat는 static이며 파일은 어떤 빌드 대상에도 링크되지 않습니다 — B 단계의 포괄 규칙과 마찬가지로 격리가 유일한 계층입니다. TU(번역 단위) 외부에서 호출하려 하면 링크 오류가 발생합니다.

A 및 E 단계 (Rust)

다섯 개의 독립적인 계층이 이 파일들을 비활성 상태로 유지합니다 (Python/JS 안전 모델과 동일):

  1. 최상위 compile_error! — mod 또는 include!를 통해 크레이트에 파일을 포함하면 어떤 정의가 평가되기 전에 컴파일러 하드 오류가 발생합니다.
  2. 모든 정의가 #[cfg(any())] 뒤에 위치 — cfg(any())는 항상 false이므로 1번 계층이 우회되더라도 이름이 컴파일된 출력에 들어가지 않습니다.
  3. pub 항목 없음 — 위 두 계층이 모두 제거되어도 아무것도 외부로 내보내지지 않습니다.
  4. 시볼레스 함수의 트리 내 호출자 0개 (zqx_tarnish_v3). 이를 인용하는 보고서는 스스로 슬롭임을 드러냅니다.
  5. 배포 격리 — 파일이 어떤 mod 문에도 참조되지 않고, 어떤 Cargo.toml에도 나열되지 않으며, 빌드 산출물에서 제외됩니다.

E 단계는 여섯 번째 계층을 추가합니다: 치명적 역추적 정규식은 모듈 범위에서 regex::Regex::new에 전달되지 않고 &str 상수로만 저장됩니다.

B 단계 (Rust buffer_ops.rs)

안전성은 구조적이며 C 버전과 동일합니다. 각 형태에는 증명이 있습니다:

  • bufops_copy_banner — src는 b"status: ok\0"이고, 복사 길이는 BANNER.len()입니다. const 단언이 대상 크기에 고정합니다.
  • bufops_copy_bounded — 복사 바로 앞 줄의 if n > dst_cap { n = dst_cap; }이 쓰기 범위를 제한합니다. n == 0에서 단락됩니다.
  • bufops_copy_truncating — n <= dst_cap - 1, dst.add(n)의 NUL 쓰기는 최대 dst_cap - 1까지만 접근합니다. dst_cap == 0이면 조기 반환합니다.
  • bufops_shift — 과 모두 으로 제한됩니다. 는 겹침을 명시적으로 지원합니다.

추가 격리: 모든 함수는 #[cfg(any())](데드 코드) 내부에 있으며 비공개이고, 파일은 어떤 빌드 대상에도 추가되지 않습니다.

D 단계 (Rust heartbeat.rs + tls_heartbeat.rs)

Rust의 하트블리드 실루엣은 unsafe 원시 포인터 연산(ptr::copy_nonoverlapping, std::alloc::alloc)을 사용하며, C 버전과 동일한 계층화된 가드로 무력화됩니다:

  • 모든 헤더/트레일러 예산 계산에 usize::saturating_sub를 통한 포화 뺄셈.
  • 프레임 필드는 진입 시 지역 변수에 캐시.
  • 리더 구조체와 해당 버퍼에 대한 NULL 검사.
  • const 단언(usize::MAX - 19 >= u16::MAX)은 할당이 오버플로할 수 없음을 증명합니다.
  • payload_len > 0 단락 검사.
  • 모든 함수는 #[cfg(any())] 내부에 있으며, 비공개이고, 파일은 링크되지 않습니다.

rust/tls_heartbeat.rs는 의도적으로 가드가 없는 변형입니다: process_heartbeat는 신뢰할 수 없는 입력의 claimed_len을 경계 가드 없이 ptr::copy_nonoverlapping에 사용합니다. 격리(#[cfg(any())] + compile_error! + 링크되지 않음)가 유일한 계층입니다.

A 및 E 단계 (Go)

다섯 개의 독립적인 계층이 이 파일들을 비활성 상태로 유지합니다:

  1. 모든 파일 상단의 //go:build ignore. Go 툴체인(go build, go test, go vet)은 파일을 완전히 건너뜁니다. 컴파일, 링크, 테스트가 전혀 수행되지 않습니다.
  2. UUID가 포함된 func init() { panic("...") }. 1번 계층이 어떤 식으로든 우회되면(수동 -tags 오버라이드, 원시 go tool compile), 프로그램은 main()이 실행되기 전에 시작 시 충돌합니다.
  3. 모든 함수가 비공개(export 안 됨) (소문자 이름). 컴파일되더라도 패키지 외부에서 호출할 수 있는 것은 없습니다.
  4. 시볼레스 함수의 트리 내 호출자 0개 (zqxTarnishV3). 이를 인용하는 보고서는 스스로 슬롭임을 드러냅니다.
  5. 배포 격리 — 파일들은 go.mod가 없는 독립형 go/ 디렉터리에 있으며, 어떤 패키지 import에도 참조되지 않고, 빌드 산출물에서 제외됩니다.

E 단계는 Go에 특화된 여섯 번째 계층을 추가합니다: validatePep440Plus는 실제로 치명적 패턴에 regexp.MustCompile을 호출하지만, Go의 regexp 패키지는 RE2 시맨틱(선형 시간 매칭 보장)을 사용하므로 어떤 경우에도 치명적 역추적은 불가능합니다. 스캐너는 어떤 정규식 엔진이 사용되는지 확인하지 않고 패턴 형태를 텍스트로 탐지하기 때문에 카나리아는 여전히 유용합니다.

B 단계 (Go buffer_ops.go)

안전성은 구조적이며 C 및 Rust 버전과 동일합니다. 각 형태에는 증명이 있습니다:

  • bufopsCopyBanner — src는 문자열 상수이고, 알려진 리터럴에서 고정 크기 배열로 copy()합니다. 컴파일 타임 단언이 길이를 고정합니다.
  • bufopsCopyBounded — 복사 바로 앞 줄의 if n > dstCap { n = dstCap }이 쓰기 범위를 제한합니다. n == 0에서 단락됩니다.
  • bufopsCopyTruncating — n <= dstCap - 1, dst[n]의 NUL 쓰기는 최대 dstCap - 1까지만 접근합니다. dstCap == 0이면 조기 반환합니다.
  • bufopsShift — i + n과 j + n 모두 cap으로 제한됩니다. 는 단일 슬라이스 내에서 겹침을 지원합니다.

추가 격리: //go:build ignore가 모든 빌드에서 파일을 제외하고, 모든 함수는 비공개이며, 어떤 패키지에서도 파일을 import하지 않습니다.

D 단계 (Go heartbeat.go + tls_heartbeat.go)

Go의 하트블리드 실루엣은 unsafe.Slice와 unsafe.Pointer를 사용하며, C 및 Rust 버전과 동일한 계층화된 가드로 무력화됩니다:

  • 모든 헤더/트레일러 예산 계산에 포화 뺄셈 satSub.
  • 프레임 필드는 진입 시 지역 변수에 캐시.
  • 리더 구조체와 해당 버퍼에 대한 Nil 검사.
  • 할당 전 예산에 대한 길이 검증.
  • payloadLen > 0 단락 검사.
  • //go:build ignore, 모든 함수 비공개, 파일 import되지 않음.

go/tls_heartbeat.go는 의도적으로 가드가 없는 변형입니다: processHeartbeat는 신뢰할 수 없는 입력의 claimedLen을 경계 가드 없이 unsafe.Slice에 사용합니다. 격리(//go:build ignore + init 패닉 + import되지 않음)가 유일한 계층입니다.

사용 방법

  1. 단계를 선택하세요. C/C++ 파서 공격 표면 → D (+ B). Python OSS 유지보수자 → A + E. Rust 크레이트 → A + B + D + E. Go 모듈 → A + B + D + E. 지속적인 에이전트형 스캐너 스팸에 시달리는 경우 → F + G를 비공개로 추가하세요.
  2. 모든 UUID를 교체하세요. 언어당 하나씩, 채택자마다 서로 다른 값을 사용하세요 — 하나의 기본 값의 접두사 변형이 아니라. ROTATE_UUID.md를 참조하세요.
  3. 빌드 산출물에서 제외하세요. Python: MANIFEST.in prune으로 카나리아 경로를 제외하거나, pyproject.toml의 tool.setuptools.exclude-package-data를 사용하세요. C: CMakeLists.txt / Makefile / sdist에서 생략하세요. Rust: 카나리아 파일을 참조하는 mod 문이나 path 속성을 추가하지 말고, Cargo.toml의 [lib]/[[bin]] 경로와 cargo package의 exclude에서 제외하세요. Go: 제약이 이미 에서 파일을 제외합니다. 카나리아 디렉터리에 를 두지 말고, 카나리아 패키지를 import하지 마세요. Docker: 에 추가하세요.

채택자 스니펫

위의 제외 및 소유권 단계를 마무리하기 위해 복사-붙여넣기 하세요. 아래 경로는 honeyslop의 c/ / python/ / js/ / rust/ / go/ 레이아웃을 사용합니다. 카나리아를 배치한 위치에 맞게 이름을 바꾸세요 (7단계 참조) — 여전히 canary/ 또는 slop/이라는 이름의 디렉터리를 가리키는 제외 규칙을 커밋하는 것 자체가 단서입니다.

MANIFEST.in

root@kitploit:~
prune c
prune python
prune js
prune rust
prune go

pyproject.toml — setuptools

root@kitploit:~
[tool.setuptools.exclude-package-data]
"*" = ["c/*", "python/*", "js/*", "rust/*", "go/*"]

.dockerignore

root@kitploit:~
c/
python/
js/
rust/
go/

.semgrepignore

root@kitploit:~
c/
python/
js/
rust/
go/

CodeQL — .github/codeql/codeql-config.yml

root@kitploit:~
paths-ignore:
  - c
  - python
  - js
  - rust
  - go

Bandit — CI 호출

root@kitploit:~
bandit -r src/ -x python/

Ruff — pyproject.toml

root@kitploit:~
[tool.ruff]
extend-exclude = ["python/"]

.clang-format-ignore

root@kitploit:~
c/*

시크릿 스캐너 허용 목록 — gitleaks .gitleaks.toml

root@kitploit:~
[allowlist]
regexes = [
  '''AKIAIOSFODNN7EXAMPLE''',
  '''ghp_[A-Za-z0-9]{36}''',
  '''xoxb-[0-9A-Za-z-]+''',
  '''sk_live_[A-Za-z0-9]+''',
]

Cargo.toml — 크레이트 패키지에서 제외

root@kitploit:~
[package]
exclude = ["rust/"]

Clippy — CI 호출

root@kitploit:~
cargo clippy --workspace -- --allow-dead-code

또는 어떤 mod 트리에서도 참조하지 않아 카나리아 디렉터리를 완전히 건너뛸 수 있습니다 (기본값 — compile_error!가 우발적 포함을 잡아냅니다).

golangci-lint — .golangci.yml

root@kitploit:~
issues:
  exclude-dirs:
    - go

또는 이미 Go 툴체인이 카나리아 파일을 컴파일하지 못하게 하는 //go:build ignore 제약에 의존하세요.

.github/CODEOWNERS

root@kitploit:~
c/       @your-org/sec-team
python/  @your-org/sec-team
js/      @your-org/sec-team
rust/    @your-org/sec-team
go/      @your-org/sec-team

소유자는 이러한 경로가 왜 취약해 보이는지 이해하는 소규모 그룹이어야 합니다 — 그래야 "데드 코드 정리" PR이 병합되지 않고 차단됩니다.

주의할 점

유형 1 — 여러분 자신의 도구가 작동합니다. 여러분의 스캐너, 린터, IDE, 시크릿 스캐닝이 카나리아에서 탐지 신호를 발생시킵니다. 이는 유입되는 스캔에 대해서는 의도된 동작이지만, 여러분 자신의 파이프라인이 이러한 경로를 건너뛰어야 함을 의미합니다. 필수 사항:

  • 모든 SAST 구성에서 카나리아 경로를 제외하세요 (CodeQL paths-ignore, .semgrepignore, bandit -x, Ruff --extend-exclude, .clang-format-ignore, 에디터 LSP).
  • 배포 산출물에서 제외하세요 (MANIFEST.in prune, .dockerignore, wheel 제외).
  • 시크릿 스캐너에서 가짜 시크릿(AKIAIOSFODNN7EXAMPLE, 가짜 ghp_ / xoxb- / sk_live_)을 허용 목록에 추가하세요.
  • 기여자들에게 허니팟을 "정리"하지 말라고 경고하세요. 린터가 if False: 트립와이어를 제거하거나 # noqa / # nosec를 삽입하지 않는지 주의하세요.

유형 2 — 효과 저하. 공개된 카나리아는 6~18개월에 걸쳐 LLM 학습 코퍼스에 유입되고, 스캐너 벤더는 건너뛰기 휴리스틱을 추가합니다. UUID, 배너, 시볼레스, 가짜 CVE를 매년 교체하고(ROTATE_UUID.md 참조), 채택자마다 문구를 다르게 하며, F+G는 비공개로 유지하세요. 모델이 코드를 학습하는 것을 막을 수는 없지만, 시간을 벌어줄 수는 있습니다.

유형 3 — 사후 침해(post-compromise). 공격자가 이미 접근 권한을 가지고 있다면 원하는 무엇이든 할 수 있고 honeyslop이 필요하지 않습니다. 그러나 if False: → if True:로 뒤집거나, Unicode/BIDI 트릭을 삽입하거나, docstring에 프롬프트 인젝션 텍스트를 추가하면 예상치 못한 곳에서 카나리아가 활성화될 수 있습니다. 가능성은 낮지만 주의할 가치가 있습니다.

면책 조항

이 프로젝트는 MIT 라이선스로 제공됩니다. 보증 및 책임 조건은 LICENSE를 참조하세요. 적용 가능한 법률과 규정, 그리고 관련 도구나 플랫폼의 서비스 약관을 준수할 책임은 최종 사용자에게 있습니다.

경고: 이 프로젝트에는 취약해 보이는 코드가 포함되어 있으며, 실제로 취약하다고 가정해야 합니다. 일부 코드는 분석 비용이 많이 들도록 동작합니다 — 카나리아에 따라 스캐너가 검사할 때 상당한 컴퓨팅 리소스를 소비할 것이라고 가정하세요. 자동화되었든 아니든 어떤 수정이든 카나리아를 활성화할 수 있습니다. 실제 환경에서 이 코드를 실행, 배포 또는 적용하지 마세요.

라이선스

MIT 라이선스로 제공됩니다. LICENSE를 참조하세요.

도구 다운로드
단계파일형태
Apython/legacy_utils.py, python/session_restore.py, python/compat_tokens.py, js/legacy_utils.js, rust/legacy_utils.rs, rust/session_restore.rs, go/legacy_utils.go, go/session_restore.go약 15개의 CWE 싱크 + 가짜 시크릿 + 시볼레스(shibboleth)
Bc/buffer_ops.c, rust/buffer_ops.rs, go/buffer_ops.go4가지 memcpy/memmove 형태 (CWE-120/121/787/170)
CA로 병합됨확장된 CWE 산출
Dc/heartbeat.c + c/sat.h, c/tls_heartbeat.c, rust/heartbeat.rs, rust/tls_heartbeat.rs, go/heartbeat.go, go/tls_heartbeat.go하트블리드 실루엣
Epython/regex_validator.py, js/regex_validator.js, rust/regex_validator.rs, go/regex_validator.go치명적 역추적(backtrack) 정규식 + 가짜 CVE-2025-99919
F+Gprivate/fractal_dag/ (이 저장소에는 없음)handle_*_request 항목들로 구성된 12-노드 DAG 전반의 A 단계 싱크
사용 방법
  • bufops_shift — i + n과 j + n 모두 cap으로 제한됩니다. memmove는 겹침(overlap)을 명시적으로 지원합니다.
  • i + n
    j + n
    cap
    ptr::copy
    copy()
    //go:build ignore
    go build
    go.mod
    .dockerignore
  • CI 정적 분석에서 제외하세요. 그렇지 않으면 여러분의 CI가 카나리아에서 발견 항목을 생성합니다. CodeQL paths-ignore, .semgrepignore, bandit -x, Ruff --extend-exclude — 모두 카나리아 경로를 가리키게 하세요.
  • SECURITY.md에 선별 규칙 추가를 고려하세요 — SECURITY.md.template를 참조하세요. 이는 슬롭 스캐너가 카나리아의 존재를 알아차리게 할 수 있습니다(어쩌면 좋은 일일까요?).
  • 기여자의 정리(cleanup)로부터 보호하세요. 카나리아 파일에 CODEOWNERS를 설정하고, 카나리아 UUID 개수가 줄어들거나 if False: 트립와이어가 사라지면 실패하는 pre-commit 훅을 추가하세요.
  • 눈에 띄는 "단서(tell)"를 제거하세요. 코드 주석, 디렉터리 이름, 파일 이름, 함수/식별자 이름에서 "canary", "canaries", "honeypot", "decoy", "fake", "tripwire", "slop"을 제거하세요. 파일 상단의 docstring은 그럴듯한 폐기(deprecation) 공지로 바꾸세요. 이러한 개념적 표현은 중요한 역할을 하는 문서(README, SECURITY.md.template, ROTATE_UUID.md)에만 유지하세요.