루비얀카 방법론은 현재 독립 패키지(루비얀카·레드팀)로 구현을 준비 중이며, 두 패키지가 완성될 때까지 이 글의 내용은 언제든 바뀔 수 있다. — 당신 서비스를, 당신이 만들지 않은 세션이 공격한다. 외부 스캔이 못 보는 것 · 자기 레드팀 · 교차세션 · 그리고 AI라는 새 전선.
§ 00 · 초록불
스캐너를 돌린다. A · 100점 · 발견 0 · 전부 통과. 안도한다.
그런데 여기까지 읽었다면 안다 — 방금 받은 건 진실이 아니라 자백이다. 나는 같은 스캐너가 “구멍 6개”에서 “이상 없음”으로, 코드 한 줄 안 바뀌고 9분 만에 뒤집히는 걸 봤다. 이 글은 그 초록불에 관한 것이다.
§ 01 · 스캐너의 자백
외부 스캐너는 표피를 본다 — 전송·헤더·쿠키·노출 파일. 필요한 위생이다. 그러나 둘을 못 한다.
하나, 스캐너는 한 순간을 본다. 배포 과도기에 딱 한 요청이 헤더를 빠뜨리자 “전부 뚫림”으로 떴다 — 실측 여덟 번으로 격파했다. 둘, 진짜 사고가 나는 곳 — 인가·주입·비즈니스 로직·서버 속 — 을 구조적으로 못 본다.
통과 = “표피는 깨끗”이지 “속이 안전”이 아니다. 그러니 스캐너의 보고를 읽지 말고, 상태를 네가 직접 다시 재라. 초록불은 주장이고, 증거는 실측한 응답이다.
§ 02 · 빌더의 맹점 — 자기 취조
만든 사람은 자기 가정 안에서만 검증한다 — “작동한다”를 증명하려는 확증편향. 뒤집어라. 네 출력을 증인석에 세우고, 거짓이라 가정하고 취조하라.
이 라우트는 인증 없이 열리나. 남의 id로 내 데이터가 열리나. 번들에 시크릿이 새나. 그러나 천장이 있다 — 감시받는 자는 자기 사각을 끝내 다 못 본다.
§ 03 · 제2의 취조관
실제로 이런 일이 있었다. 한 세션이 공용 함수를 지우고, 자기 눈에 보이는 소비자 둘을 고치고 배포하려 했다 — 그런데 그 세션의 출발점에는 구조적으로 안 보이던 제3의 소비자가 있었다. 다른 세션이 그걸 갖고 있었다. 다른 base, 다른 가정이 그 맹점을 잡았다.
일반화하면: 그 코드를 만들지 않은 세션이 공격하게 하라. 그 세션의 사각은 네 사각이 아니다. “예측 불가”는 무작위가 아니라 다른 출발 가정에서 온다.
§ 04 · 유료 공격자는 합리적이다
돈 받고 네 서비스를 치는 자는 무작위로 안 움직인다 — ROI를 좇는다. 크라운 주얼을 노린다: 돈흐름·인증·개인정보·가용성. 그러니 그 순서로 방어하라.
화장품 같은 헤더 지적 100개보다 결제 경로의 경쟁 조건 하나가 치명적이다. 스캔보다 먼저 물어라 — 유료 공격자가 여기서 정확히 무엇을 원하나.
§ 05 · 새 전선 — AI 그 자체
AI로 짓는 사람에게 반전 하나. 네 서비스는 AI가 짓기만 하는 게 아니라 종종 AI를 품는다 — 챗봇·비서. 그게 가장 새롭고 가장 안 지켜진 표면 = 프로에게 최고의 ROI다.
프롬프트 인젝션 — 사용자 입력·외부 콘텐츠가 네 지시를 덮는다. 비안전 출력 — AI 출력을 무검증으로 렌더하면 XSS가 된다. 그리고 자력 빌더에게 가장 잔인한 것 — 비용 폭발: 비싼 프롬프트를 퍼부어 네 돈을 태운다. AI 층도 다른 용의자처럼 취조하라.
§ 06 · 정직한 한계
어떤 스캔도 충분하지 않다 — 표피뿐이다. 교차세션 레드팀도 완전 독립은 아니다: 같은 모델은 잔여 공통 맹점을 남긴다. 다른 모델을 섞어라.
그리고 가장 잔인한 것 — 네 레드팀 자신이 썩을 수 있다. 심어 둔 센서가 한 번도 실패 안 하는 빈 파일이 된다. 감시자도 감사하라. “이상 없음”을 자신하는 방어가, 의심해야 할 방어다.
CODA · 실제로 무는 방인가
스캐너의 초록불, “테스트 전부 통과”, “배포 완료” — 전부 자백이다. 네 서비스는 문서에 적힌 취조가 아니라 실제로 도는 취조만큼만 안전하다.
소리 내어 물어라 — 네 방어는 실제로 무는 취조실인가, 아무도 확인 안 한 초록불인가.
Read this note at sass.studio.