AI를 사용하여 권한 부여(Authorization) 버그를 찾고, 실제가 아닌 버그를 증명하는 방법
요약
AI를 활용해 권한 부여(Authorization) 취약점을 탐색하고, 발생하는 수많은 거짓 양성(False Positive)을 효과적으로 검증 및 반박하는 방법론을 제시합니다. 저비용 모델로 후보를 대량 생성(Fan-out)한 뒤, 고비용 모델로 이를 적대적으로 검증(Adversarial verification)하여 정확한 결과만을 도출하는 것이 핵심입니다.
핵심 포인트
- AI 생성 버그 보고서의 범람으로 인한 버그 바운티 프로그램의 위기
- 재현율을 높이는 Fan-out 단계와 정확성을 높이는 적대적 검증 단계의 분리
- 단순한 취약점 발견보다 '성립하지 않는 후보를 반박'하는 능력이 차별점
- 정확한 부정(Correct Negatives)을 도출하는 방법론의 중요성
AI를 사용하여 권한 부여 (Authorization) 버그를 찾고, 실제가 아닌 버그를 증명하는 방법
플래그십 포스트 초안. 현재 게시 가능 (미공개 취약점 없음). 마지막에 언급된 실제 사례 연구는 조율된 공개(coordinated disclosure)를 위해 보류됨.
2026년, 버그 바운티 (Bug Bounty) 프로그램들이 문을 닫기 시작했습니다. Nextcloud는 AI가 생성한 저품질 보고서의 범람을 이유로 유료 보상을 중단했습니다. Mattermost는 프로그램을 종료했습니다. Internet Bug Bounty는 지급액을 약 80% 삭감했습니다. 공통점은 AI가 버그를 찾지 못한다는 것이 아니라, AI의 도움을 받은 대부분의 "발견 사항"이 그럴듯하지만 틀렸으며, 분류 (Triage) 팀이 그들에 의해 압도당하고 있다는 것입니다.
이는 문제의 틀을 바꿉니다. 2026년에 희소한 기술은 취약성 후보를 생성하는 것이 아닙니다. 언어 모델 (Language Model)은 점심 식사 전에도 50개를 던져줄 것입니다. 핵심은 성립하지 않는 49개를 반박하는 것입니다. 차별점은 주요 결과물이 _정확한 부정 (Correct Negatives)_인 방법론에 있습니다.
다음은 제가 소스 공개 (Source-available) 대상을 위해 사용하는 방법론이며, 정직한 결과가 "여기에 버그는 없다"였던 실제 사례입니다.
방법론: 찾기 위해 확산하고, 반박하기 위해 수렴하라
두 단계, 두 가지의 서로 다른 비용 계층:
-
Fan-out (저비용 모델). 대상의 권한 부여 (Authorization) 표면을 하위 시스템으로 분할하고 각각을 병렬로 읽습니다. 각 리더(reader)의 유일한 임무는 _후보(candidate)_가 될 만한 깨진 불변량 (broken invariants) — 즉, 소유자 확인 없이 ID만으로 객체가 로드되는 곳, 보호된 동작이 재인증 게이트를 건너뛸 수 있는 곳, 두 코드 경로가 동일한 항목을 서로 다르게 권한 부여하는 곳 등을 찾아내는 것입니다. 재현율 (Recall)을 최적화하세요. 대부분의 결과는 거짓 양성 (False positive)일 것이라고 예상하십시오.
-
적대적 검증 (Adversarial verification, 고비용·고추론 모델). 각 후보를 가져와서 그것을 _제거 (kill)_하려고 시도합니다. 기본값은 '반박됨 (REFUTED)'으로 설정합니다. 후보가 살아남으려면, 가드 (guard)가 부재함을 증명하는 특정 소스 코드 라인을 인용할 수 있어야 하며, 위험한 경로에 도달할 수 있어야 하고, 상위 단계에서 이미 이를 차단하지 않아야 합니다. 살아남은 모든 항목을 깨진 불변량 — 시스템이 절대 위반해서는 안 되는 규칙을 한 문장으로 서술한 것 — 으로 정의하고, 이를 핵심 (core) 대 설정 의존적 (config-dependent) 유형으로 분류하십시오.
가장 중요한 결과물은 각각의 이유가 포함된 반박 (refutations)의 더미입니다. 이 더미야말로 분류자 (triager)가 신뢰하는 보고서와 프로그램 실행이 중단될 정도의 보고서를 가르는 차이점입니다.
실제 사례: Ory Kratos 설정 및 OIDC (판결: 방어됨)
Ory Kratos는 오픈 소스 ID 서버입니다. 이 서버의 설정 흐름은 비밀번호 변경, 이메일/복구 주소 변경, OIDC 제공자 연결/해제와 같은 여러 권한이 필요한 동작들을 한곳에 집중시키는데, 이는 단 하나의 일관성 없는 체크만으로도 계정 탈취 (Account Takeover)로 이어질 수 있는 바로 그 표면 (surface)입니다. 조사하기에 아주 좋은 대상입니다.
Fan-out 과정에서 매우 유혹적인 후보가 하나 발견되었습니다. OIDC 전략에서, ID 제공자 왕복 (round-trip) 과정 동안 유지되는 연속성 컨테이너 (continuity container)는 ID에 결합되어 있지 않습니다. 일시 중지 (pause)와 재개 (resume) 시점 모두에서 코드가 WithIdentity 옵션을 누락하고 있어, 소유자 확인이 nil identity에서 단락 (short-circuit)됩니다. 이는 코드베이스 내에서 이 결합을 건너뛰는 유일한 pause/continue 쌍입니다. 만약 당신이
누락된 바인딩(binding)은 재개(resume) 경로가 해당 바인딩되지 않은 컨테이너로부터 _쓰기 대상(write target)_을 유도할 때만 악용 가능합니다. 하지만 그렇지 않습니다. 설정 콜백(settings callback)에서는 대상 식별자(target identity)가 활성 세션 쿠키(live session cookie)에서 오며, 권한 게이트(privilege gate)는 콜백 시점에 다시 확인되며(단순히 시작 시점에만 확인하는 것이 아님), 컨테이너의 특성(traits)은 결코 적용되지 않습니다. 로그인/등록 콜백(login/registration callback)에서는 대상 식별자가 검증된 토큰 내의 암호학적으로 서명된 OIDC subject로부터 유도됩니다. 이 역시 컨테이너로부터 유도되는 것이 아닙니다. 따라서 공격자가 타인의 일시 중단된 흐름(paused flow)을 재전송(replaying)하여 할 수 있는 최악의 행동은, 자신의 계정에 제공자(provider)를 연결하거나 충돌 체크(collision check)를 유발하는 것뿐입니다. 누락된 WithIdentity는 도달 가능한 어느 곳에서도 하중을 지탱하지 않는 심층 방어(defense-in-depth) 요소입니다.
주변 코드들도 확인했습니다. 권한이 있는 세션의 재인증 게이트(re-auth gate)는 모든 설정 메서드 전반에 걸쳐 일관되게 강제됩니다. 미인증 이메일을 기존 계정에 연결할 수 있게 하는 "무음 계정 병합(silent account merge)" 분기는 오픈 소스 빌드에서는 데드 코드(dead code)입니다. 이는 nil로 배포되는 정책 훅(policy hook) 뒤에 가려져 있습니다. 이 각각의 요소들은 실마리처럼 보였으나, 모두 소스 코드 수준에서 깔끔하게 차단되었습니다.
결론: 공격 표면(surface)이 잘 구축되어 있습니다. 이를 보고서로 작성했다면 "정보 제공용(informational)" 수준의 내용으로 신뢰도를 깎아먹었을 것입니다. 여기서 얻은 가치는 보고서를 제출하지 않을 수 있다는 확신, 그리고 왜 설계가 견고하게 유지되는지에 대한 정밀한 지도였습니다.
실제로 가치가 있는 클래스
동일한 방법론을 다른 대상을 향해 적용했을 때, 실제 취약점이 드러났습니다: 메인 코드 경로에서는 강제되지만, 대체 진입점(alternate ingress)에서는 이를 반영하지 못하는 권한 부여 가드(authorization guard). 시스템이 기본 경로에서는 사용자의 액세스 권한을 취소하지만, 자격 증명으로 인증된 보조 진입점에서는 권한 확인을 재구현하면서 한 가지 조건을 누락하는 경우입니다. 이로 인해 "권한이 취소된" 사용자가 측면 통로(side door)를 통해 여전히 접속할 수 있게 됩니다. 이 클래스는 중복 방지(dup-resistant)가 가능하며(단순히 요청을 뿌리는 것이 아니라 특정 시스템의 신뢰 모델을 이해해야 함), 스캐너가 탐지할 수 없고(구문이 아닌 의미론이 중요함), 영향력이 매우 높습니다. 상세 내용은 조율된 공개(coordinated disclosure)가 완료된 후에 공유하겠습니다.
이것이 2026년에도 지속 가능한 기술인 이유
수문장(Gatekeepers)들은 특히 물량 공세에 대응하여 장벽을 높이고 있습니다. 그 장벽 너머에서 번창할 연구자들은 AI의 도움을 받은 작업이 _엄격(rigorous)_한 사람들일 것입니다. 즉, 발견한 내용을 깨진 불변량(broken invariants)으로 구조화하고, 소스 코드에 근거하며, 무엇보다도 대부분의 결과물을 걸러내는 검증 단계(verification step)를 거친 결과물을 내놓는 사람들입니다. AI를 사용하여 수작업으로는 결코 읽을 수 없었던 양의 코드를 읽으십시오. 그런 다음, 분류 담당자(triager)가 나서기 전에 AI를 적대적(adversarially)으로 활용하여 스스로의 오류를 증명하십시오.
물량이 아닌 신호(Signal)가 핵심입니다. 그것이 이제 게임의 전부입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기