
AI 에이전트의 권한 규칙에 `bash -c`라는 허점이 있었던 이야기
요약
AI 코딩 에이전트의 커맨드 허가 리스트(Allowlist) 운영 중 발생한 보안 허점을 다룹니다. 범용 셸 실행계 커맨드가 포함될 경우 발생하는 구조적 취약점과 이를 해결하기 위한 분류 기준 재정립 과정을 설명합니다.
핵심 포인트
- 커맨드 명 기반의 허가 리스트는 범용 셸 실행계 커맨드에 의해 무력화될 수 있음
- 허가 리스트 운영 시 실행 내용의 고정 여부를 검증하는 것이 중요함
- 이름 기반이 아닌 '문자열 의존성' 기반으로 분류 기준을 전환하여 보안 강화
AI 코딩 에이전트에게 실행시키는 커맨드는 허가 리스트(Allowlist)로 관리하고 있습니다. "이것은 자동 실행 OK", "이것은 매번 확인"이라는 운영 방식입니다. 어느 날, 이 허가 리스트의 작성 방식 그 자체에 구조적인 허점이 있다는 것을 깨달았기에, 그 전말을 공유합니다.
무슨 일이 일어나고 있었나
허가 리스트는 "이 커맨드 명이라면 자동 실행해도 좋다"라는 형태로 작성되어 있었습니다. 개별 커맨드를 하나하나 검토하여 리스트에 추가해 나가는, 꾸준하지만 안전한 방향이라고 생각한 운영 방식입니다.
그런데, 전달받은 문자열을 그대로 셸(Shell)에 전달하여 실행하는 범용 실행계 커맨드(이른바 셸 래퍼 (Shell Wrapper))를 그대로의 형태로 허가 리스트에 포함하고 있었다는 사실을 깨달았습니다. 이 타입의 커맨드는 전달하는 문자열에 따라 실행 내용이 얼마든지 변합니다. "이 커맨드 명이라면 허가"라는 규칙의 이면에서, 실질적으로는 "무엇이든 허가"에 가까운 상태가 발생하고 있었습니다.
개별 커맨드를 정성스럽게 쌓아 올리는 운영 방식 자체는 틀리지 않았습니다. 하지만 범용 실행계 커맨드를 하나 섞어 넣는 것만으로, 그 정성 자체가 의미를 잃게 되는 구조적인 약점이었습니다.
어떻게 고쳤나
먼저, 실제로 어디까지 통과되는지를 수중에서 검증했습니다. 예상했던 것보다 넓은 범위가 "자동 실행 취급"되고 있음을 확인한 후, 수행한 일은 두 가지입니다.
- 범용 셸 실행계 커맨드는 허가 리스트에서 제외하고, 매번 확인이 필요한 취급으로 되돌림
- 허가 리스트의 분류 기준 자체를 "커맨드 명이 일치하는가"가 아니라 "실행 내용이 고정되어 있는가, 외부에서 전달된 문자열에 의존하는가"로 재검토
첫 번째 조치만으로도 당장의 허점은 막을 수 있지만, 효과가 있었던 것은 두 번째였습니다. 분류 기준을 이름 기반에서 "문자열 의존 여부" 기반으로 바꿈으로써, 동일한 구조의 허점을 향후 만들지 않도록 할 수 있게 되었습니다.
배운 점
- 허가 리스트를 "커맨드 명"만으로 관리하면, 범용 실행계 커맨드가 하나 섞이는 순간 형해화된다
- 안전한 방향이라고 생각한 운영 규칙도, 실제로 직접 움직여 검증하지 않으면 허점의 유무를 알 수 없다
- 분류 기준을 "이름"에서 "실행 내용이 고정되어 있는지 여부"로 바꾸면, 동종의 허점을 사전에 방지하기 쉬워진다
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기