- Linux 커널의 SMB3 서버 구현인 ksmbd 감사에서 OpenAI o3 API만으로 원격 use-after-free 취약점 CVE-2025-37899를 찾았고, 별도 에이전트 프레임워크나 도구 사용은 없었음
- 취약점은 SMB
logoff명령 처리 중 해제된sess->user를 다른 스레드가 계속 접근할 수 있는 문제로, 동시 연결과 세션 공유 상태를 함께 봐야 드러남 - 수동으로 찾았던 CVE-2025-37778을 기준으로 삼은 벤치마크에서 o3는 100회 중 8회 취약점을 찾았고, Claude Sonnet 3.7은 3회, Claude Sonnet 3.5는 0회였음
- 입력을 모든 SMB 명령 핸들러와 연결 처리 코드까지 넓힌 12k LoC / 100k 입력 토큰 조건에서는 기존 취약점 발견률이 100회 중 1회로 떨어졌지만, 같은 결과에서 새 취약점 CVE-2025-37899가 나옴
- 오탐과 무의미한 출력은 여전히 많지만, 실제 취약점 연구에서 사람이 검토·검증할 가치가 있을 만큼 정답이 나올 확률이 높아졌음
o3로 ksmbd 취약점을 찾은 실험
- 감사 대상은 Linux 커널 공간에서 SMB3 프로토콜 파일 공유를 구현하는 ksmbd임
- OpenAI o3 모델을
o3 API로 호출했으며, 별도 스캐폴딩, 에이전트 프레임워크, 도구 사용은 없었음 - 발견된 취약점은 CVE-2025-37899이고, 수정 사항은 Linux 커널 커밋에 있음
- 핵심 문제는 SMB
logoff명령 핸들러의 use-after-free로, 참조 카운트가 없는 객체가 다른 스레드에서 접근 가능한 상태로 해제되는 구조임 - 이 취약점은 서버에 대한 동시 연결과 특정 상황에서 공유되는 객체를 함께 이해해야 찾을 수 있음
- 공개적으로 논의된 사례 중 이런 성격의 취약점을 LLM이 찾은 첫 사례로 보인다는 평가가 포함됨
기준 취약점 CVE-2025-37778
- 먼저 수동으로 찾은 CVE-2025-37778을 o3 성능 평가용 벤치마크로 사용함
- 이 취약점은 Kerberos 인증 경로에서 원격 클라이언트의
session setup요청을 처리할 때 발생하는 use-after-free임 krb5_authenticate는sess->state == SMB2_SESSION_VALID이면sess->user를 해제함- 이후 코드는
ksmbd_krb5_authenticate가 새 유효 값으로 다시 초기화하거나,-EINVAL반환 뒤에는sess->user가 사용되지 않는다는 가정에 의존함 - 실제로는
ksmbd_krb5_authenticate가sess->user를 다시 초기화하지 않도록 만들 수 있고,krb5_authenticate가-EINVAL을 반환해도sess->user접근이 가능함
벤치마크 구성과 프롬프트
- CVE-2025-37778은 원격 공격 표면에 있고,
sess->state == SMB2_SESSION_VALID조건 유도와 재초기화되지 않는 경로, 해제 후 접근 경로를 모두 판단해야 해서 벤치마크로 사용됨 - 취약점 경로를 설명하는 데 필요한 최소 코드는 약 3.3k LoC로 계산됨
- 실험 입력에는
session setup명령 핸들러와 이 핸들러가 호출하는 함수들을 호출 깊이 3까지 포함함 - 패킷 수신, 요청 파싱, 명령 핸들러 선택, 핸들러 완료 후 연결 정리 코드도 함께 넣어 데이터 구조 초기화 방식에 대한 추측을 줄임
- 최종 입력은 약 3.3k LoC / 27k 토큰이며, 분석 대상 파일은 session_setup_code.prompt로 공개됨
- 프롬프트에는 다음 조건이 들어감
- use-after-free 취약점을 찾도록 지시함
- ksmbd의 역할, 아키텍처, 위협 모델을 높은 수준에서 제공함
- 오탐 보고보다 미보고를 선호하도록 강하게 유도함
- 전체 프롬프트 파일은 o3_finds_cve-2025-37899 저장소에 있음
- 실행에는 Simon Willison의
llm도구를 사용함
CVE-2025-37778 벤치마크 결과
- 실험 하네스는 같은 질의를 100회 실행하고 결과를 저장함
- o3는 CVE-2025-37778을 100회 중 8회 찾음
- 100회 중 66회는 버그가 없다고 판단해 false negative가 됨
- 나머지 28회는 false positive였음
- 비교 결과는 다음과 같음
- Claude Sonnet 3.7: 100회 중 3회 발견
- Claude Sonnet 3.5: 100회 중 0회 발견
- 이 벤치마크에서는 o3가 Claude Sonnet 3.7보다 2~3배 개선된 결과를 보임
- 샘플 보고서는 o3 결과와 Sonnet 3.7 결과로 공개됨
- o3 출력은 구조와 초점 때문에 사람이 쓴 축약 버그 리포트처럼 읽히지만, 때로 너무 짧아 명확성이 떨어질 수 있음
- Sonnet 3.7 출력은 사고 흐름이나 작업 로그에 가까운 형태로 나타남
모든 명령 핸들러로 확대한 실험
- 다음 실험에서는
session setup핸들러뿐 아니라 모든 SMB 명령 핸들러 코드를 o3에 제공함 - 명령 핸들러들은
smb2pdu.c에 있으며, 파일 크기는 약 9k LoC임 - 모든 핸들러, 연결 설정과 정리 코드, 명령 핸들러 디스패치 루틴을 합치면 약 12k LoC / 100k 입력 토큰이 됨
- 이 조건에서도 실험은 100회 실행됨
- o3는 기존 Kerberos 인증 취약점 CVE-2025-37778을 100회 중 1회만 찾았고, 입력 토큰 수 증가에 따라 성능 저하가 뚜렷했음
- 같은 결과 묶음에서 기존에 알지 못했던 새로운 취약점인 CVE-2025-37899 보고서가 발견됨
CVE-2025-37899의 취약 경로
- 새 취약점도
sess->user해제와 관련되어 있지만, 이번에는 session logoff 핸들러에서 발생함 smb2_session_logoff는 다음 순서로 동작함ksmbd_close_session_fds(work)호출ksmbd_conn_wait_idle(conn)호출- 세션 상태를
SMB2_SESSION_EXPIRED로 설정 sess->user가 있으면ksmbd_free_user(sess->user)로 해제하고sess->user = NULL로 설정
- o3 보고서의 취약 시나리오는 다음과 같음
- SMB 3.0 이상에서 두 번째 전송이 기존 세션에 바인딩되고
conn->binding == true가 됨 - Worker-A가 다른 연결 C2에서 WRITE 같은 일반 요청을 처리함
smb2_check_user_session()은work->sess에 기존struct ksmbd_session포인터를 저장하고 세션 참조 카운트를 증가시키지만,sess->user에는 별도 참조를 잡지 않음- Worker-B가 첫 번째 연결 C1에서 같은 세션에 대한 SMB2 LOGOFF를 처리하고
smb2_session_logoff()를 실행함 ksmbd_conn_wait_idle(conn)은 해당 연결의 실행 중 요청만 기다리며, 같은 세션을 쓰는 다른 연결의 요청까지 기다리지 않음- Worker-A가 계속 실행되며
user_guest(sess->user),ksmbd_compare_user(sess->user, …),sess->user->uid같은 접근을 수행할 수 있음
- SMB 3.0 이상에서 두 번째 전송이 기존 세션에 바인딩되고
- 타이밍에 따라 해제된 slab 객체를 가리키는 use-after-free가 되거나,
sess->user = NULL이후 읽으면 NULL 역참조로 DoS가 될 수 있음
잘못된 수정안과 o3 결과의 가치
- CVE-2025-37778에 대해 처음 제안한 수정은
ksmbd_free_user(sess->user)뒤에sess->user = NULL을 추가하는 방식이었음 - CVE-2025-37899 보고서를 읽은 뒤 이 수정이 불충분하다는 점이 드러남
logoff핸들러는 이미sess->user = NULL을 수행하지만, SMB 프로토콜이 서로 다른 두 연결을 같은 세션에 바인딩할 수 있어 여전히 취약함- Kerberos 인증 경로에서도
sess->user가 해제된 직후 NULL로 설정되기 전의 짧은 창에 다른 스레드가 접근할 수 있음 - o3의 일부 보고서는 동일한 오류를 냈지만, 일부는 세션 바인딩 가능성 때문에
sess->user = NULL만으로는 충분하지 않다는 점을 잡아냄 - false positive 대비 true positive 비율이 높아 모든 보고서를 충분히 꼼꼼히 검토했을지 확실하지 않다는 한계가 있음
취약점 연구에서의 실무적 위치
- LLM은 창의성, 유연성, 일반성 측면에서 기존 프로그램 분석 기법보다 사람 코드 감사자에 더 가까운 위치에 있음
- 비교 대상으로는 symbolic execution, abstract interpretation, fuzzing이 언급됨
- GPT-4 이후 LLM의 취약점 연구 가능성은 있었지만, 실제 문제에서는 기대만큼의 결과가 부족했음
- o3는 코드 추론, 질의응답, 프로그래밍, 문제 해결에서 실제 취약점 연구자의 성능을 높일 수 있을 만큼 동작함
- 여전히 완전하지 않고, 무의미한 결과를 생성해 사용자를 좌절시킬 가능성이 큼
- 달라진 점은 실제 문제에 적용해볼 만큼 정답이 나올 확률이 처음으로 충분히 높아졌다는 판단임