Claude로 코드의 공격 표면(attack surface) 줄이기
Using Claude to reduce the attack surface of code
TL;DR Highlight
Claude로 25개 오픈소스를 분석해 불필요하게 열린 코드 493건을 찾았다
Who Should Read
서버·인프라 설정이 복잡해 인증 전에 어떤 코드가 실행되는지 파악하지 못하는 백엔드·보안 담당 개발자
Core Mechanics
- 취약점 대신 도달 가능 코드를 줄인다
- 개별 취약점을 찾아 고치는 방식은 남은 취약점에 대해 알려주는 게 없어서 확장성이 낮다고 한다.
- 도달 가능한 코드를 줄이면 아직 모르는 취약점의 심각도도 함께 낮아진다.
- 25개 프로젝트에서 493건 발견
- 대상은 C, C++, Java, PHP, Python 등 오픈소스 25개(500만 줄 이상)다.
- 설정 옵션 17,000개 이상을 목록화했고 그중 3,842개가 보안 관련이었다.
- 세 가지 관점으로 찾았다
- 기본 설정에서 열려 있지만 기본 기능엔 필요 없는 코드를 본다.
- 따로 보면 멀쩡하지만 같이 켜면 문제인 옵션 조합을 본다.
- 인증 전·사용자 상호작용 없이·프로토콜 상태 전이 전에 실행되는 복잡한 코드를 본다.
- 설정 조합이 보안 장치를 조용히 껐다
- 경고도 문서도 없는 보안 관련 조합이 162건이었고 그중 94건은 보안 통제를 조용히 껐다.
- 인증 전 불필요한 노출은 기본 설정의 gated 프로젝트에서 93건이었다.
- 호스트명 deny 규칙은 역방향 DNS 조회가 꺼져 있으면 IP와 매칭되지 않아 fail open이 됐고, 이 패턴이 서로 무관한 4개 프로젝트에서 나왔다.
- OpenSSH도 예외가 아니었다
- 10.4의 sshd에서 기본 설정으로 인증 전 클라이언트가 닿는 ML-DSA-44 실험 코드 약 4,500줄을 찾았다.
- 이는 기본 sshd의 인증 전 코드의 약 16%였다.
- 키를 파싱한 뒤에야 허용 여부를 확인하고 있었고, 10.5에서 확인을 파싱 앞으로 옮겼다.
- 재사용 가능한 Claude skill로 묶었다
- 세 번의 pass를 매번 빈 컨텍스트로 시작하고 이전 pass의 짧은 요약만 넘긴다.
- 발견마다 동적 트레이스로 확인하고, 기본 설정 gate는 프로젝트 테스트 스위트와 블랙박스 회귀 테스트 결과가 동일해야 한다.
- 비기본 설정을 바꾸는 gate는 사람이 판단하도록 따로 둔다.
Community Reactions
- 보안 작업을 AI가 거부한다는 불만이 많았다는 경험
- 자기 코드베이스의 보안 감사를 Claude와 GPT가 거부해 GLM이나 Kimi로 마쳤다는 의견이 있었다.
- PHP CVE 대응 중 Claude와 Codex가 초기 조사를 거부해 GLM 5.3으로 바꿨고, 인증 관련 유닛 테스트 작성도 거부당했다는 경험이 있었다.
- Cyber Verification Program 참여 중에도 덜 강력한 모델로 내려간다는 불만도 있었다.
- 결과의 품질을 의심하는 의견
- 커널 개발자의 발표를 근거로, 이전 AI 취약점 발표 상당수가 문제가 아니거나 이미 수정된 것이었다고 주장하는 댓글이 있었다.
- AI 연구소가 충분히 이해하지 못한 채 결과를 서둘러 발표하는 것 아니냐는 의견이다.
- 같은 접근을 직접 써 봤다는 경험
- Vix IDE에 "공격 표면을 줄이도록 재구성, 기능을 feature-flag Rust crate로 분리, 최소 버전 빌드"라는 프롬프트를 썼다는 댓글이 있었다.
- 전체 코드베이스가 여러 crate와 Cargo feature로 분리되어 감사자가 기능 하나씩 볼 수 있게 됐다고 한다.
- AI가 만든 코드의 취약점을 지적하는 반론
- Anthropic이 남의 코드 취약점 탐지만 말하고 AI가 새 코드에 만드는 취약점은 언급하지 않는다는 의견이 있었다.
How to Apply
- 서비스의 인증 전 진입점부터 목록화하기
- 오늘 Claude Code에 코드베이스를 열고 인증·세션 확립 전에 실행되는 파싱·핸들러 목록을 뽑게 하라.
- 각 항목에 기본 설정에서 닿는지와 실제 쓰임을 표시하게 하라.
- 설정 옵션 조합 점검 시간 잡기
- 보안 관련 옵션 목록을 만들어 두 개씩 조합했을 때 통제가 꺼지는지 확인하라.
- 기능 비활성화 시 리스너나 로그인 경로가 남는지도 확인하라.
- 문제 조합은 설정 로드 시점에 오류로 거부하도록 바꿔라.
- 검사를 파싱 앞으로 옮기기
- 허용 목록 확인을 역직렬화·서명 검증보다 먼저 두도록 코드를 고쳐라.
- 클라이언트가 주장한 타입이 아니라 실제 파서가 쓰는 타입으로 비교하라.
- 게이트 변경은 회귀 테스트로 검증하기
- gate를 넣은 뒤 기존 테스트 스위트를 돌려 기본 동작이 그대로인지 확인하라.
- 비기본 설정에 영향을 주는 변경은 사람이 승인하도록 분리하라.
Try It
# Claude Code 또는 Claude/ChatGPT에 붙여넣기 (원문 skill의 간이 버전)
너는 보안 리뷰어다. 아래 코드베이스에서 공격 표면을 줄일 후보를 찾아라. 세 번의 pass로 나눠 진행하고, 각 pass 끝에 다음 pass에 넘길 3줄 요약을 남겨라.
Pass 1: 기본 설정에서 도달 가능하지만 의도된 기능이 쓰지 않는 코드
Pass 2: 인증 전, 사용자 상호작용 없이, 또는 프로토콜 상태 전이 전에 실행되는 복잡한 코드
Pass 3: 따로는 괜찮지만 함께 설정하면 보안 통제를 조용히 끄거나 약화시키는 옵션 조합
각 pass마다 먼저 진입점 목록을 만들고, 각 발견에 대해 파일·함수, 도달 경로, 제안하는 gate(검사 순서 변경, 상태 순서 가드, 설정 로드 시 조합 거부)를 표로 정리하라. 기본 동작을 바꾸는 제안은 '사람 결정 필요'로 따로 표시하라.
대상 코드: {{코드베이스 또는 디렉터리}}
이어서 해 볼 것: 제안한 gate 하나를 적용하고 {{테스트 명령}}으로 기본 동작이 그대로인지 확인하라.Terminology
관련 논문
Rust off Rails: 코드 없이 Markdown 60개로 만든 AI 에이전트용 웹 스택
Markdown 규칙 60개로 에이전트가 Rust 웹앱을 짜게 한다는 프레임워크
LayerFS: AI 코딩 에이전트를 위한 파일시스템
에이전트마다 임시 Workspace를 마운트하고 결과만 커밋하는 파일시스템
Launch HN: Alter (YC S25) – 멀티유저 에이전트용 접근 제어
에이전트마다 별도 신원·정책·감사로 API 키 공유 문제를 푼다
WhatsApp 도움말 페이지에 숨겨진 LLM 지시문: 규제기관을 추천하지 말라
WhatsApp 도움말에 화면엔 안 보이는 AI 지시문 102개가 숨어 있었다
같은 시뮬레이션, 다른 근거: 도구 출력을 파일로 넘기면 LLM 에이전트 정확도가 어디서 깎이나
긴 툴 출력을 파일로 넘기자 GPT-5.1은 정확도 11.3%p 하락, 정식 출력 지정하니 회복
가짜 뉴스가 진짜 폭락을: LLM 트레이딩 에이전트 대상 정보 주입 공격
가짜 헤드라인 한 줄로 LLM 트레이딩 에이전트 62%를 조종했다(프롬프트 주입은 14%)
Harness Engineering 101: LLM은 뇌, harness는 몸
에이전트는 JSON 배열을 관리하는 루프이고, 16개 챕터로 직접 만들어 본다
Harness²: 에이전트 harness를 스스로 고쳐 쓰는 재귀 최적화 프레임워크
모델은 고정하고 harness를 재귀로 고쳤더니 벤치마크 점수가 최대 11.8%p 올랐다