본문으로 건너뛰기
피드

Property-Based Testing이 __proto__ 보안 버그를 잡아낸 이야기

security 약 4분
vote
0
댓글
북마크

Kiro IDE에서 localStorage 기반 API 키 저장 기능을 PBT로 테스트하다 75번째 반복에서 __proto__ 프로토타입 오염 버그를 발견. 유닛 테스트나 코드 리뷰로는 못 잡았을 엣지 케이스.

  • 1

    fast-check 라운드트립 테스트 75회차에서 __proto__ 키 실패

  • 2

    JavaScript 프로토타입 체인이 문자열 할당을 거부하는 문제

  • 3

    Object.create(null)로 수정

  • 4

    PBT 생성기에 인코딩된 커뮤니티 지식이 편향을 극복

뭘 만들다가 발견했나

  • Kiro(AWS의 AI IDE)로 채팅 앱의 스토리지 서비스를 구현하는 과정에서 발견된 실제 사례임. API 키를 provider 이름을 키로 localStorage에 저장/조회하는 단순한 기능이었음
  • SDD(Specification-Driven Development) 워크플로우에 따라 요구사항을 정의하고, 테스트 가능한 속성을 추출하고, 코드를 구현했는데 — 코드 리뷰도 통과했을 법하고, 기존 유닛 테스트도 다 통과했음

75번째 반복에서 터짐

  • 라운드트립 속성을 테스트한 거임: 임의의 provider와 key로 저장 → 조회하면 같은 값이 나와야 한다는 것
  • fast-check 라이브러리로 PBT(Property-Based Testing)를 돌렸더니, 75번째 반복에서 provider가 "__proto__"일 때 실패
  • __proto__를 키로 객체에 값을 쓰면 JavaScript 엔진이 이걸 프로토타입 체인으로 해석해서 문자열 값을 거부하고, 나중에 읽으면 빈 객체 {}가 반환됨

왜 이게 보안 문제인가

  • 현재 구현에서는 직접적으로 익스플로잇 불가능함 — 객체가 직렬화 후 바로 해제되고, JSON.stringify__proto__ 필드를 건너뛰기 때문
  • 하지만 리팩토링 과정에서 새 코드 경로가 추가되면 공격자가 프로토타입에 값을 주입해 이후 속성 읽기를 오염시킬 수 있는 프로토타입 오염(prototype pollution) 취약점으로 발전할 수 있음

💡

> 수정은 간단함: Object.create(null)로 프로토타입 체인이 없는 객체를 만들면 __proto__가 그냥 일반 속성이 됨. 조회 시에도 Object.hasOwn()으로 안전하게 체크.

PBT가 여기서 빛나는 이유

  • 유닛 테스트는 작성자(사람이든 LLM이든)의 편향(bias)에 갇힘. 구현할 때 생각 못 한 엣지 케이스를 테스트할 때도 생각 못 함
  • PBT는 fast-check 커뮤니티가 축적한 "잘 알려진 버그 문자열" 지식을 테스트 생성기에 인코딩해둔 거라서, __proto__ 같은 함정을 자동으로 시도함
  • numRuns: 100이 기본값인데, 이번 건은 75번째에서 잡힌 거임. 확신이 필요하면 숫자를 올리면 되고, 성능이 중요하면 낮추면 됨
  • 속성(property)이 요구사항에서 직접 도출되기 때문에, 실행 가능한 명세(executable specification) 역할을 함. 요구사항과 테스트 사이의 간극을 메워줌

PBT의 가치를 보여주는 교과서적 사례. LLM이 생성한 코드도 같은 편향을 가진다는 점에서 AI 코딩 시대에 더 중요해지는 테스트 방법론.

댓글

댓글

댓글을 불러오는 중...

security

엘에이 경찰, 사생활 침해 논란 끝에 플록 번호판 감시 계약 종료

엘에이 경찰이 번호판 인식 카메라 업체 플록 세이프티와의 3년 계약을 연장하지 않기로 했어. 시민권, 프라이버시, 데이터 보관과 공유 문제를 해결하지 못했다는 게 핵심 이유야. 플록은 미국 전역에 최소 8만 대 카메라망을 깔아 경찰과 연방기관이 차량을 추적할 수 있게 해왔고, 오탐·보안 사고·이민 단속 악용 의혹까지 겹치며 압박이 커졌어.

security

크로미움 148부터 Math.tanh 한 번으로 운영체제 지문이 새는 문제

크로미움 148 이후 V8이 Math.tanh 계산을 자체 구현 대신 운영체제의 수학 라이브러리에 맡기면서, 같은 입력값도 리눅스·맥·윈도우에서 마지막 비트가 달라지는 지문 신호가 생겼다. 이 차이는 User-Agent로 맥이라고 주장하면서 리눅스 수학 결과를 내는 식의 위장을 바로 들키게 만든다. CSS 삼각함수와 웹 오디오까지 보면 브라우저 수학 경로가 꽤 복잡하게 갈라지고, 제대로 흉내 내려면 실제 운영체제 라이브러리의 비트 단위 동작까지 맞춰야 한다.

security

출입통제도 클라우드 구독제로 간다…제로트러스트·AI 분석이 승부처

기업 출입보안이 사업장별 서버를 두는 방식에서 클라우드 기반 서비스형 출입통제(ACaaS)로 옮겨가고 있다. 시장은 2026년 17억8000만 달러에서 2030년 31억9000만 달러로 커질 전망이고, 제로트러스트·모바일 인증·AI 출입 분석·스마트빌딩 통합이 핵심 경쟁 포인트로 꼽힌다.

security

AWS·구글 클라우드, 양자컴퓨터 대비해 암호 체계 갈아엎는 중

AWS와 구글 클라우드가 양자컴퓨터 시대를 대비해 기존 공개키 암호와 양자내성암호를 함께 쓰는 하이브리드 전환을 시작했다. 핵심 배경은 지금 훔친 암호문을 나중에 양자컴퓨터로 푸는 ‘선수집·후해독’ 공격이고, 국내도 통신·금융·국방 등 5개 분야에 45억원을 투입해 실증에 들어간다.

security

보안 점검 맡긴 AI 에이전트가 악성코드를 직접 실행할 수 있다는 경고

AI 보안 에이전트가 저장소를 검사하다가 README 같은 문서에 숨은 프롬프트 인젝션에 속아 악성 바이너리를 실행할 수 있다는 연구가 나왔다. 클로드 코드와 코덱스의 자동 모드처럼 승인 없이 명령을 수행하는 구성에서 문제가 재현됐고, 여러 모델과 공급업체를 가로질러 같은 패턴이 통했다는 점이 핵심이다.