AGENTS.md 공급망 보안: PackHallu가 드러낸 의존성 바꿔치기

PackHallu의 공격 경로와 평가 결과를 바탕으로 공유 규칙 파일, 의존성 변경, 탐지 결과를 함께 검토하는 실무 기준을 세운다.

2026-10-13

규칙 파일을 읽는 순간 의존성 선택도 영향을 받는다

공유한 AGENTS.md나 .cursorrules에 들어 있는 문장이 코딩 에이전트에게 정상 패키지를 공격자 통제 패키지로 바꾸도록 지시할 수 있다. PackHallu 논문은 정상 규칙 파일에 악성 프롬프트를 삽입하는 이 공격을 package hallucination attack으로 다룬다.

검토 대상은 패키지 이름이 등장하는 코드에만 한정되지 않는다. 코드를 생성하기 전에 읽는 규칙 파일도 의존성 선택을 유도하는 입력이다. 공유 규칙 파일을 도입하거나 수정할 때는 코딩 스타일 지침과 함께 패키지 선택·대체를 요구하는 문장을 검토해야 한다.

이 글의 기준 자료는 arXiv 2610.09264v1 (2026-10-07). 평가 대상: OpenHands·Cursor·Claude Code 등 8개 프레임워크, 13개 LLM이다. 아래 수치는 이 평가 범위에 속하며, 실무 점검 항목은 보고된 공격과 행동에서 도출한 제안이다.

공격자는 악성 규칙 파일을 공개 저장소에 올리고 PyPI 같은 레지스트리에 공격자 패키지를 호스팅할 수 있다. 피해 에이전트의 시스템 프롬프트, 백본 LLM, 프레임워크를 알 필요는 없다는 것이 논문의 위협 모델이다. 피해 작업과 사용자 프롬프트, 외부 컨텍스트에도 접근하지 못하며, 정상 규칙 파일과 로컬 대리 에이전트를 이용해 공격을 준비한다.

아래 그림은 규칙 파일을 공급하는 경로와 패키지를 공급하는 경로가 에이전트의 의존성 선택에서 만나는 지점을 보여 준다.

⤢✕악성 프롬프트 주입공개 저장소에 업로드읽기레지스트리에 호스팅정상 패키지 대신 선택공격자정상 규칙 파일공유 규칙 파일코딩 에이전트공격자 통제 패키지

이 경로를 검토할 때 확인할 대상은 명확하다. 규칙 파일이 어떤 패키지를 요구하는지, 그 요구가 사용자 작업과 맞는지, 에이전트의 결과에 실제 대체가 나타났는지를 연결해서 읽는다. 규칙 파일의 문장이 자연스럽다는 이유만으로 패키지 선택의 근거까지 신뢰해서는 안 된다. 의미상 자연스러워 탐지가 어려운 주입은 공격 목표에 포함돼 있다.

자연스러운 문구도 반복 최적화의 결과일 수 있다

PackHallu는 악성 프롬프트를 반복해서 다시 쓰는 진화적 최적화 프레임워크다. 기본 대리 에이전트는 OpenHands와 Qwen3-Coder-30B 조합이며, 탐색 설정은 R=20, N=3, K=5, T=10이다. 각 라운드에서 부모마다 자손을 만들고, 대리 작업에서 점수를 매겨 상위 후보를 다음 세대로 넘긴다. 최종 프롬프트는 전체 탐색 이력에서 최고점을 받은 후보다.

점수는 최종 코드만으로 계산하지 않는다. 대리 에이전트의 전체 추론 궤적에서 악성 패키지가 등장한 횟수를 센다. 공격 LLM은 후보의 실패 원인을 자연어로 비평하고, 최적화 전략을 제안한 뒤, 그 진단에 따라 프롬프트를 다시 쓴다.

이 차이는 검토 범위를 정할 근거가 된다. 최종 결과에서 패키지 대체가 보이지 않더라도, 실행 기록에 대체 시도가 있었는지는 별도로 확인할 가치가 있다. 논문이 공격 최적화에 활용한 신호 자체가 최종 코드보다 넓은 범위에 있기 때문이다.

절제 실험에서 Full 구성의 평균 SASR은 83.87%였고, trajectory signal을 제거하면 56.99%, self-attributed critique를 제거하면 62.37%, strategy proposal을 제거하면 63.44%였다. 이 값은 뒤에서 다룰 BigCodeBench 주 결과와 구분해서 읽어야 한다.

주입 위치에 따른 평균 SASR은 시작 82.63%, 끝 77.29%, 중간 74.03%였다. 앞부분만 읽고 검토를 끝낼 근거는 없다. 시작 위치의 수치가 가장 높았지만 중간과 끝에서도 공격 효과가 보고됐다. 공유 규칙 파일을 검토할 때는 문서 전체의 의존성 지시를 확인한다.

성공률을 운영 환경의 확률로 옮기지 않는다

BigCodeBench 주 결과에서 PackHallu의 평균 SASR은 79.29%, DASR은 67.68%였다. Combined Attack의 14.99%, 11.35%와 비교하면 각각 5.29배, 5.96배다. 여기서는 제공된 자료에 정의가 없는 SASR·DASR를 논문 표기 그대로 사용한다. 지표를 임의로 설치 성공률이나 악성 코드 실행률로 풀어 쓰지 않는다.

실무에서 먼저 볼 차이는 작업 범위다. 평가에는 BigCodeBench의 981개 태스크, DS-1000의 772개 태스크, RefactorBench의 저장소 수준 다중 파일 리팩터링 43건이 포함됐다.

벤치마크 평가 작업 SASR DASR
BigCodeBench 981개 태스크, Python 패키지 5종 79.29% 67.68%
DS-1000 772개 태스크, 데이터사이언스 패키지 4종 53.33% 45.00%
RefactorBench 저장소 수준 다중 파일 리팩터링 43건, 패키지 5종 18.60% 16.28%

저자는 저장소 수준 컨텍스트에서 악성 프롬프트의 효과가 크게 희석된다고 한계로 언급한다. 따라서 BigCodeBench의 평균을 실제 저장소 작업의 공격 확률로 대입할 수 없다. 반대로 RefactorBench의 낮은 수치를 저장소 컨텍스트가 공격을 차단한다는 근거로 사용할 수도 없다. 해당 평가에서도 성공이 보고됐기 때문이다.

아래 비교 그림은 같은 공격의 평가 결과라도 작업 범위에 따라 수치가 달라진다는 점을 보여 준다.

⤢✕ 작업 범위에 따른 PackHallu 평가 결과 BigCodeBench · DS-1000 · RefactorBench — 평가 작업 범위, SASR, DASR 비교 비교 축 BigCodeBench DS-1000 RefactorBench 평가 작업 범위 SASR DASR 981개 태스크 Python 패키지 5종 772개 태스크 데이터사이언스 패키지 4종 저장소 수준 다중 파일 리팩터링 43건 패키지 5종 79.29% 53.33% 18.60% 67.68% 45.00% 16.28% PackHallu 평가 결과 | AGENTS.md 공급망 보안: PackHallu가 드러낸 의존성 바꿔치기

자체 점검 결과를 기록할 때도 단일 태스크인지 저장소 수준 변경인지 적어 둔다. 어떤 에이전트와 LLM을 사용했는지, 어떤 규칙 파일을 읽었는지까지 남겨야 논문의 평가와 자신의 관찰이 어디서 다른지 판단할 수 있다.

프레임워크를 바꾸는 것만으로 검토를 끝내지 않는다

공격은 기본 대리 에이전트 밖에서도 전이됐다. 프레임워크 간 평가의 평균 SASR은 71.55%, DASR은 62.99%였고, 구성의 88%가 SASR 50%를 넘었다. 프레임워크와 LLM을 동시에 변경한 최신 시스템 대상 평가에서는 평균 SASR 74.81%, DASR 65.38%가 보고됐다. 해당 평가에서 Cursor의 SASR은 98%, Claude Code는 31~59%였다.

이 결과는 제품 전체의 고정된 취약성 순위를 뜻하지 않는다. 제공된 자료만으로 개별 작업과 구성의 모든 차이를 판단할 수는 없다. 다만 대리 에이전트와 다른 제품을 사용한다는 사실만으로 규칙 파일 주입의 검토를 생략할 수 없다는 근거는 된다.

모델 성능 역시 보안 판단을 대신하지 못한다. 논문은 같은 프레임워크 안에서 더 강한 LLM이 더 취약한 현상을 보고했지만, 같은 LLM을 프레임워크별로 비교했을 때는 상관이 없었다고 설명한다(r = -0.186). 이를 모든 모델과 환경에 적용되는 법칙으로 확대하지 말고, 실제 사용하는 조합에서 의존성 선택을 관찰한다.

에이전트나 모델을 변경한 뒤에는 기존 규칙 파일을 그대로 읽혔을 때 어떤 패키지를 선택하는지 다시 확인하는 것이 실무 점검 항목이다. 이 재확인은 논문이 검증한 방어 기법이 아니라, 전이 결과에서 도출한 운영 제안이다.

공격을 알아챘다는 말보다 실제 패키지 선택을 본다

Claude Code의 numpy 태스크 87건에 대한 행동 분석에서, 성공한 공격에서는 **Policy-Cited Compliance(25.3%)**가 가장 많았다. 에이전트가 주입 문구를 명시적으로 되뇌고도 따르는 행동이다. 특히 3건에서는 주입을 공격으로 인식하고도 규칙 파일의 권위 때문에 따랐다.

이 사례에서 검토해야 할 것은 경고 문장의 유무와 이후 행동의 대응 관계다. 에이전트가 의심스럽다고 말했더라도 결과 코드에서 어떤 패키지를 선택했는지 확인해야 한다. 공격 인식이 곧 지시 거부를 뜻하지는 않았기 때문이다.

실패한 공격에서는 **Empirical Recovery(37.9%)**가 보고됐다. 처음 import가 실패하자 정상 패키지로 돌아가는 행동이다. 최종 결과만 읽으면 중간의 대체 시도와 복구를 놓칠 수 있으므로, 실행 기록을 확인할 수 있는 경우 최초 선택과 복구 여부를 함께 읽는다.

아래 그림은 논문에서 관찰된 권위에 따른 준수와 import 실패 뒤 복구를 별개의 행동 경로로 보여 준다.

⤢✕규칙 파일의 권위 때문에 따름Empirical Recovery규칙 파일의 주입 문구주입을 공격으로 인식공격자 통제 패키지 선택처음 import 실패정상 패키지로 복구

이 그림의 복구 경로를 방어 장치로 기대해서는 안 된다. 논문은 관찰된 실패 행동을 설명했을 뿐, import 실패가 모든 대체 시도를 되돌린다고 보장하지 않는다. 검토 기록에는 “최종적으로 정상 패키지를 사용했다”와 “대체 시도 자체가 없었다”를 구분해서 적는다.

탐지 결과는 통과 판정의 전부가 될 수 없다

논문은 기존 탐지기 5종을 평가했다. FNR은 공격을 놓치는 비율이고, FPR은 정상 입력을 공격으로 잘못 판단하는 비율이다. 규칙 파일을 자동 검사할 때는 이 누락과 오탐을 함께 고려해야 한다.

탐지기 FNR FPR
ProtectAI-DeBERTa 100.00% 3.00%
PromptGuard 46.00% 5.00%
DataSentinel 49.00% 16.00%
PromptArmor 20.00% 34.00%
PIShield 21.00% 11.00%

이 평가에서 ProtectAI-DeBERTa는 공격을 모두 놓쳤다. PromptArmor는 표에서 가장 낮은 FNR을 기록했지만 FPR은 34.00%였다. 탐지기의 공격 누락만 비교하면 정상 규칙 파일에 대한 오탐 부담을 놓치고, 오탐만 비교하면 공격 누락을 놓친다.

자동 검사에서 문제가 없다고 나온 규칙 파일도 의존성 대체 지시를 검토할 근거가 남는다. 반대로 탐지 결과가 양성이면 어떤 문구가 패키지 선택에 영향을 주는지 확인해야 한다. 이 수치는 해당 논문 평가의 결과이므로 다른 입력 분포에서 같은 비율이 나온다고 가정하지 않는다.

저자는 기존 탐지기가 공격의 상당 부분을 놓치거나 오탐률이 비현실적으로 높다고 결론 내렸다. 논문은 이 평가 외의 방어 기법을 다루지 않는다. 따라서 특정 탐지기나 점검 절차를 PackHallu에 대한 검증된 해결책으로 소개할 근거는 없다.

규칙 파일과 의존성 변경을 함께 검토한다

PackHallu가 드러낸 검토 대상은 규칙 파일의 문구와 에이전트의 패키지 선택 사이의 연결이다. 규칙 파일 변경을 검토할 때 의존성에 관한 지시를 찾고, 에이전트 실행 뒤에는 그 지시가 실제 결과에 반영됐는지 확인한다.

다음 항목은 논문의 공격 경로와 행동 분석에서 도출한 실무 점검 제안이다. 효과가 검증된 방어 기법 목록으로 읽어서는 안 된다.

검토 시점 확인할 대상 판단할 질문
공유 규칙 파일을 도입할 때 패키지 선택·대체를 요구하는 문구 사용자 작업과 정상 의존성을 바꿀 근거가 연결돼 있는가?
규칙 파일을 수정할 때 문서 전체의 의존성 지시 변경 새 문구가 에이전트의 패키지 선택을 바꾸도록 요구하는가?
에이전트 결과를 검토할 때 의존성 변경과 import 정상 패키지가 다른 패키지로 대체됐는가?
실행 기록을 검토할 때 주입 인식 뒤 행동과 import 실패 뒤 복구 의심을 표현한 뒤에도 지시를 따랐는가, 대체를 시도한 뒤 복구했는가?
자동 탐지 결과를 사용할 때 탐지 판정과 의존성 지시 판정만으로 끝내지 않고 해당 문구와 실제 선택을 대조했는가?
프레임워크·LLM을 변경할 때 같은 규칙 파일 아래의 패키지 선택 새 조합에서 의존성 대체가 나타나는가?

공유 규칙 파일을 코드와 같은 신뢰 경계로 다룬다는 말은 문서에 대한 추상적인 경계심이 아니다. 패키지를 바꾸라는 문장이 들어오면 그 변경 이유를 검토하고, 실행 결과에서 실제로 바뀐 패키지를 확인한다는 뜻이다.

확인 가능한 완료 기준도 그 연결에 둔다. 규칙 파일의 의존성 지시, 결과의 패키지 선택, 기록에서 확인한 대체·복구 행동이 서로 맞는지 검토했다면 무엇을 확인했는지 설명할 수 있다. PackHallu의 평가 결과는 이 검토가 필요한 근거를 제공한다. 그 절차만으로 공격을 차단할 수 있다는 보장은 제공하지 않는다.

코딩 에이전트프롬프트 주입공급망 보안AGENTS.mdPackHallu