CounterProof

발견은 평결이 아니다

AI는 이제 오후 한나절에 수천 건의 취약점 발견을 생성할 수 있다. 발견은 증인이지 평결이 아니다 — 그리고 아무도 검증할 수 없는 유일한 필드가 바로 모두가 부풀리는 필드다. 홍수에 빠지지 않고 그것을 읽는 법.

2026년 8월, 약 108시간의 머신 타임 동안 하나의 자원봉사 캠페인이 오픈웨이트 모델을 비트코인의 오픈소스 프로젝트 501개에 돌려 7,958건의 잠재적 보안 발견을 기록했고, 그중 1,280건이 ‘높음’ 또는 ‘치명적’으로 분류되었습니다. 그 캠페인 — 그리고 그것이 충돌하는 규정 — 에 대해서는 기계가 코드를 읽고 있다에 썼습니다. 이 노트는 그 숫자 자체에 관한 것입니다.

한 보안 벤더가 세 개의 AI 코드 리뷰 시스템을 비공개 테스트 애플리케이션에 맞붙인 벤치마크를 공개했기 때문입니다: 하나는 심어 놓은 취약점 89개 중 68개를, 다른 하나는 60개, 세 번째는 58개를 찾았습니다. 벤더들은 이제 그 비율로 — 더 많은 발견을, 더 낮은 비용에 — 경쟁합니다. ‘찾기’는 가격 전쟁 속의 상품이 되었습니다.

그러니 발견이 실제로 무엇인지 분명히 말해 둘 가치가 있습니다 — 그 집계는 엉뚱한 것을 재고 있기 때문입니다.

발견은 증인이지, 평결이 아니다

문헌학은 오백 년 전에 이것을 정리했고, 그 용어는 정확합니다.

고대 텍스트가 손으로 베낀 많은 필사본으로 전해질 때, 어떤 사본도 텍스트 그 자체 아닙니다. 각각은 증인입니다: 원본을 담되 — 필경사의 실수, 습관, 물려받은 표류를 함께 담은 파생 문서. 세 필사본이 일치한다는 것은 그 독법이 진본이라는 뜻일 수도 있고 — 셋 다 같은 결함 있는 원본에서 내려왔다는 뜻일 수도 있습니다. 이것을 가려내는 학문이 비판 정본을 만듭니다: 최대한 확정된 텍스트와, 그 아래에 저울에 올린 모든 증인, 모든 이문, 모든 편집 판단과 그 근거를 기록하는 교감기(apparatus)를 갖춘.

AI가 생성한 취약점 발견은 정확히 이 의미의 증인입니다. 그것은 결함이 아닙니다. 결함에 대한 모델의 보고 — 코드의 실제 속성에 모델의 습관, 훈련 계보, 그것을 낳은 프롬프트가 섞인 것 — 입니다. 두 스캐너의 일치는 버그가 실재한다는 뜻일 수도 있고, 둘이 같은 사각지대와 같은 템플릿을 공유한다는 뜻일 수도 있습니다. 대체로 같은 공개 코퍼스로 훈련된 이상, 후자는 흔한 일입니다. 상관된 증인들의 일치는 증인에 대한 증거이지, 코드에 대한 증거가 아닙니다.

그리고 문헌학자들이 가장 힘겹게 얻은 규칙이 고스란히 이전됩니다: 유창한 독법이 의심스러운 독법입니다. 필경사는 어려운 구절을 편한 상투구로 다듬어 버리고, 매끈한 쪽은 저자의 말보다 필경사의 ‘개선’인 경우가 더 많습니다. 취약점 보고서에는 고정된 장르가 있습니다: 제목, 약점 클래스, 심각도, 인용, 그리고 “공격자는 …할 수 있다” 문단. 언어 모델은 이 형식을 설득력 있게 생성합니다 — 결함이 존재하든 안 하든. 광택은 진실에 대한 정보를 담지 않습니다. 이 장르에서 유창함은 자격증이 아닙니다. 확인해야 할 대상입니다.

그래서 집계는 잘못된 단위입니다. 증인을 세어 놓고 평결이라고 보고하는 것입니다.

심각도가 보고서들이 과장하는 지점이다

인플레이션은 균일하지 않습니다. 구조적 이유로 한 지점에 집중되며, 그 이유는 이름 붙일 가치가 있습니다.

*“이 함수는 밀리초 타임스탬프를 초 단위 정밀도의 컬럼과 비교한다”*는 무언가를 인용하는 주장입니다 — 파일, 행, 커밋. 열어 보면 1분 안에 결판납니다. **“치명적”**은 아무것도 인용하지 않습니다. 치명적이라고 적힌 코드 행은 없습니다. 심각도는 도달 가능성, 악용 가능성, 폭발 반경에 대한 판단이며, 소스에 닻이 없기에 유창한 생성기가 견제 없이 위로 표류하는 바로 그 지점입니다. 극적인 독법이 더 쉽고, 보고 사슬의 모든 유인이 더 큰 숫자에 보상을 주며, 산출물 안의 무엇도 저항하지 않습니다.

그래서 캠페인이 1,280건을 “높음 또는 치명적"이라고 보고할 때, 정직한 독법은 이렇습니다: 생성기가 그렇게 라벨을 붙인 발견이 1,280건. 라벨은 문서에서 가장 검증하기 어려운 필드이고, 헤드라인에서 가장 큰 몫을 해내고 있는 것이 바로 그것입니다.

악용 가능한가? 아직 아무도 말하지 않았다

발견과 결함 사이에는 집계가 건너뛰는 한 단계가 있습니다: 감정(adjudication) — 어떤 발견이 실재하고, 어떤 것이 도달 가능하며, 어떤 것이 중요한지 결정하는 일. 그 단계는 여전히 인간의 것이고, 생성처럼 확장되지 않습니다.

그 단계를 건너뛰면 무슨 일이 생기는지에 대한 가장 명확한 공개 측정은 curl에서 나옵니다. 7인의 자원봉사 보안팀은 AI 지원 제출물이 도착하자 확인된 취약점 보고 비율이 15% 이상에서 5% 미만으로 떨어지는 것을 지켜봤습니다 — 엉터리 보고 하나하나가 여전히 반박에 몇 시간씩 드는 채로. 어떤 보고는 curl에 존재하지 않는 함수의 HTTP/3 익스플로잇에 대해 GDB 세션과 레지스터 덤프까지 갖춘 완전체로 도착했습니다. 메인테이너는 트리아지 부담을 “DDoS나 다름없다"고 표현했고, 결국 프로젝트는 버그 바운티 프로그램을 닫았습니다 — AI의 도움으로 만들어진 유효한 보안 보고를 단 한 건도 보지 못했다면서.

그 숫자는 올바른 방향으로 읽으십시오. AI 발견이 무가치하다는 증명이 아닙니다 — 발견의 유창함과 유효성이 서로 독립이라는 것, 그리고 감정 단계를 제거하면 신호 대 잡음비가 붕괴한다는 것의 증명입니다. 보고는 더 많아지고 더 자신만만해졌습니다. 검증을 살아남는 비율은 내려갔습니다.

홍수는 성가심이 아니라 보안 문제다

“발견이 너무 많다"를 성가심으로 분류하고 싶어집니다. 아닙니다. 생성이 감정을 앞지르면 진짜 발견은 사라지지 않습니다 — 그럴듯한 이백 건 뒤의 대기열에 묻히고, 아무도 비울 수 없는 대기열은 무언가를 숨기는 대기열입니다. curl의 단어 — DDoS — 가 올바른 음역입니다. 자신만만한 보고에 빠져 죽는 팀은 보고가 없는 팀보다 안전하지 않습니다. 반대신문을 받지 않은 증인들에게 주의력을 소진한 팀입니다.

두 개의 경보를 구분해 두기

여기서 두 주장이 뒤섞이며, 그것을 분리하는 것이 규율의 전부입니다.

총량으로는, 위험은 실재합니다. 오래된 코드에는 정말로 막대한 미수정 결함이 있고, 값싸고 지치지 않는 탐색기는 그 일부를 표면화할 것입니다. 이 범주 전체를 과장으로 치부하는 것은 틀렸습니다.

발견 단위로는, 표명된 치명도는 체계적으로 과대평가되어 있습니다 — 위쪽으로. 아무도 검증할 수 없는 유일한 필드가 모두가 부풀리는 필드이기 때문입니다. 각 경보를 평결로 다루는 것 역시 틀렸습니다 — 반대 방향으로.

오류는 한쪽의 경보로 다른 쪽의 질문에 답하는 것입니다. “이 생태계 어딘가에 진짜 버그가 많다"는 당신의 행에 있는 발견을 악용 가능하게 만들지 않습니다. 그리고 “이 특정 경보들 대부분은 잡음이다"는 당신의 코드베이스가 깨끗하다는 뜻이 아닙니다.

꿰뚫어 보는 것

중세의 교감자는 전승 전체를 정화할 수 없었습니다. 할 수 있었던 것은: 모든 독법에 조건을 달고 그 조건을 명시하는 것. 같은 수가 여기서도 통합니다. 발견을 건네받으면, 물으십시오:

  1. 실제로 어느 증거 단계에 도달했는가? 소스에서 추적됨, 컴파일됨, 테스트됨, 실행 상태에서 재현됨 — 같은 주장이 아닙니다. 발견은 그 뒤의 작업보다 높은 확신을 걸쳐서는 안 됩니다.
  2. 당신의 빌드에서 도달 가능한가, 아니면 원리상 도달 가능한가? 도달 가능성 논증이 없는 심각도는 기분이지 측정이 아닙니다.
  3. 감정되었는가, 평균되었는가? 도구 셋이 사각지대를 공유한다면, 셋의 일치는 세 개의 확인이 아닙니다. 소수 발견은 값싼 오라클 확인 — 테스트 실행, 명세 읽기, 경로 실행 — 의 가치가 있습니다. 투표가 아니라.
  4. 이미 수정되었거나, 이미 알려졌는가? 메인테이너가 지난달 닫은 발견은 역사의 증인이지, 당신의 리스크의 증인이 아닙니다.

어느 것도 별난 것이 아닙니다. 비판 정본이 필사본 더미에 하는 일입니다: 증인들을 대조하고, 또 하나의 의견보다 강한 증거에 비추어 감정하고, 교감기 — 판단, 불확실성, 검토했다가 기각한 독법들 — 를 보존하는 것.

죽은 발견이 모두 같은 죽음을 맞은 것은 아니다

대부분의 발견은 살아남지 못합니다. 그것은 정상이고, 그것이 요점입니다 — 그러나 발견이 어떻게 죽었는지는 정보이며, 전부를 “기각"이라 적힌 한 통에 쏟아붓는 리뷰는 그 정보를 버린 것입니다.

문헌학은 경우를 나누며, 그 구분은 이름을 가질 만큼 오래되었습니다. 현존하는 다른 필사본을 베낀 것으로 판명된 필사본은 계산에서 통째로 제외됩니다 — eliminatio codicum descriptorum — 틀려서가 아니라, 독립적 증언을 아무것도 보태지 않기 때문입니다. 그 일치는 애초에 증거가 아니었습니다.

세 가지 죽음. 그리고 같은 뜻이 아닙니다:

  • 중복. 여러 도구가 같은 발견을 냈다. 그 도구들이 독립적이지 않다면 — 훈련 데이터와 템플릿을 공유하는 이상 흔히 그렇습니다 — 그 일치는 세 부의 사본이 된 하나의 독법이지 세 개의 확인이 아니며, 그것을 세 번 세는 것이 거짓 확신이 제조되는 방식입니다. 중복은 지우되, 독립성 가정을 지우지 말고 기록하십시오: 진짜로 독립적인 리뷰어들의 일치는 아무것도 아닌 게 아닙니다.
  • 거짓. 코드가 하지 않는 일을 한다고 발견이 말한다. 파일을 열면 결판납니다. “오탐"이라고 말할 때 대부분이 염두에 두는 유일한 범주입니다.
  • 참. 그러나 더는 존재하지 않는 텍스트에 대해. 발견은 정확합니다 — 그 뒤에 수정된 리비전에 대해. 증인은 정직했고, 코드가 그 아래에서 움직였습니다. 고정된 업스트림 리비전에서 닫힌 결함은 그 리비전에 대해 오탐이 아니며 오탐으로 기록되어서는 안 됩니다. 다만 그것은 발견이 자신이 읽은 리비전을 말할 수 있을 때만 성립합니다: 자기 리비전을 대지 못하는 보고서는 지나간 텍스트의 정직한 증인이 아니라 — 현재 텍스트에 대한 유통기한 지난 주장입니다.

독법 자체의 오류는 두 번째뿐입니다. 세 번째의 고정 안 된 경우는 그것을 보고한 파이프라인의 오류입니다. 각 발견이 어떤 죽음을 맞았는지 말하는 기록은 그 자리에 없었던 사람도 감사할 수 있습니다. 비율 — “이백 건을 여섯 건까지 추렸다” — 은 그럴 수 없고, 품질 신호도 아닙니다: 게으른 파이프라인은 쓰레기를 생성하고 버리는 것으로 그 비율에 도달합니다. 제거는 산출물이 아닙니다. 생존자 뒤의 증거가 산출물입니다.

정본은 무엇을 위한 것인가

목록이 아니라 정본을 만드는 이유는, 누군가 평결에 도달해야 하고 그것이 리뷰어는 아닐 것이기 때문입니다.

메인테이너는 패치 여부를 결정합니다. 제조자는 기술 파일에 무엇이 들어갈지 결정합니다. 기업 구매자의 보안팀은 서명 여부를 결정합니다. 각자가 평결에 도달하고, 각자는 나중에 — 덜 우호적이고 시간은 더 많은 누군가에게 — 어떻게 그 평결에 도달했는지 보이라고 요구받을 것입니다. 그들이 리뷰어에게 필요로 하는 것은 저울에 올릴 의견 하나가 아닙니다. 자신의 결정이 그 추궁을 살아남도록 배열된 증거입니다.

유럽에서 이것은 좋은 관행에서 법적 요건으로 바뀌고 있습니다. 사이버복원력법은 제조자에게 제품 보안에 대해 *“효과적이고 정기적인 테스트와 검토를 실시할 것”*을 요구하고(부속서 I 제II부 (3), 참고 번역), 기술 문서는 *“적합성 검증을 위해 수행된 테스트 보고서”*를 담아야 합니다(부속서 VII (6), 참고 번역) — 시장 출시 후 최소 10년, 또는 지원 기간이 더 길면 그 기간 동안 보존됩니다(제13조 (13)). 적극적으로 악용되는 취약점과 중대 사고에 대한 제14조 통보는 2026년 9월 11일에 시작되고, 규정은 2027년 12월 11일부터 전면 적용됩니다.

실제로 요구되는 것을 읽으십시오. 깨끗한 스캔도, 낮은 숫자도 아닙니다. 수행된 테스트의 보고서. 10년간 보존되고, 그 자리에 없었던 사람이 읽을 수 있는. 자신만만한 심각도를 걸친 발견 목록은, 아래에 교감기가 없고 무엇이 왜 기각되었는지의 기록이 없다면, 그 독해를 살아남지 못합니다. 정본은 살아남습니다 — 모든 주장이 그 뒤의 증거를 명시하고, 제거된 모든 독법이 이유와 함께 기록되며, 모든 정정이 서면으로 이루어지기 때문입니다.

의무는 제조자에게 있지, 외부 리뷰어에게 있지 않습니다. 여기 기술된 종류의 외부 리뷰는 당신이 꾸리는 기술 문서를 뒷받침합니다. 완전한 파일이 아니고, 규정이 요구하는 곳에서 인증기관의 적합성 평가를 대신하지도 않습니다. 그러나 그것은 그 파일에서 자신의 작업에 대해 만들기 가장 어려운 부분입니다 — 그것이 지녀야 할 유일한 속성이, 당신이 아닌 다른 누군가가 그것을 썼다는 것이기 때문입니다.

왜 우리가 신경 쓰는가

CounterProof에서 우리는 기계가 쓴 코드의 적대적 리뷰를 실천하며, 이 질문들은 우리에게 이론이 아닙니다 — 우리의 운영 규칙입니다. 발견은 평균되지 않고 감정됩니다. 모든 주장은 도달한 증거 단계를 명시하고 그 이상은 말하지 않습니다. 업스트림에서 이미 수정된 발견은 집계되지 않고 철회됩니다. 그리고 우리 자신의 주장이 살아남지 못할 때는 서면으로, 공개적으로 철회합니다(영어). 우리는 발견 개수를 팔지 않으며, 개수를 보고 사지 말라고 조언할 것입니다. 스캐너는 필경사이고, 필사실은 이제 밤낮없이 푼돈으로 돌아갑니다. 귀했던 것은 사본이 아닙니다. 정본입니다.

더 긴 논증 — 위 모든 주장의 조건부 형태와 우리 방법의 한계를 포함해 — 은 기계 생성 텍스트의 대조와 계보에 관한 우리의 워킹 페이퍼에 있습니다. 전문은 여기(영어). 동료 평가 전의 초고이며, 그렇게 명시되어 있습니다.


위의 수치들에는 출처가 있습니다: 501개 프로젝트 캠페인은 우리의 이전 노트에 문서화되어 있습니다. 세 시스템의 벤치마크 비율은 벤더의 공개 게시물에서 나왔습니다. curl의 확인율, 유령 함수 보고, 바운티 프로그램 폐쇄는 The New Stack, BleepingComputer, The Register의 보도입니다. 사이버복원력법 인용은 규정(EU) 2024/2847을 가리키며 — 우리 홈페이지에 실린 것과 같은 조문이고, 한국어 인용문은 당사의 참고 번역입니다. 주장이 인용된 발견이 아니라 우리의 추론인 곳 — 심각도가 위로 부풀려진다는 것, 유창함과 유효성이 독립이라는 것 — 은 그렇게 밝혔습니다. 이 페이지는 영어 원문의 번역본이며, 차이가 있는 경우 원문이 우선합니다. 여기에 오류가 있다면 이 페이지에서 서면으로 정정하겠습니다.

← 모든 노트