
Rails Active Storage/libvips CVE-2026-66066를 조사하기 위한 포렌식 툴킷 및 에이전트 스킬: 조작된 blob 지표, 노출 기간, 데이터 유출을 탐지합니다.
Rails 애플리케이션과 KindaRails2Shell로 알려진 Active Storage 및 libvips 임의 파일 읽기 취약점인 CVE-2026-66066에 대해 두 가지 질문에 답하기 위한 도구와 방법론:
보안 권고문 GHSA-xr9x-r78c-5hrm은 취약점을 설명하고 패치된 버전을 명시했지만, 이러한 질문을 평가하기에 충분한 세부 정보를 공개하지 않았다. 이 프로젝트는 그 부분을 돕기 위한 것이다.
이것은 라이브러리가 아니라 문서 및 스킬 저장소이다. 여기에 있는 어떤 것도 당신의 애플리케이션에 설치되지 않는다. 에이전트가 이를 읽고 다른 곳에 체크아웃된 당신의 애플리케이션에 대해 작업하며, 프로덕션에서 실행되는 유일한 스크립트는 컨테이너에 복사해 넣는 단일 자체 포함 파일이다.
Rails는 직접 업로드 시 클라이언트가 바이트를 검사받지 않고 설정할 수 있는 content_type 컬럼을
읽어 해당 blob이 이미지 처리될 수 있다고 판단한다. 그런 다음 libvips는 매직 바이트를 스니핑하여
파일이 실제로 무엇인지 판단한다. 처음 10바이트가 MATLAB 5.0이라고 주장하는 파일은 libvips의
MATLAB 로더로 라우팅되고, 이는 파일을 libmatio에 넘기며, libmatio는 다른 바이트 범위를 기준으로
디스패치하여 MAT 7.3을 찾아내는데, 이것이 HDF5이다. HDF5의 External File List는 데이터셋의 바이트가
경로와 오프셋으로 지정된 다른 파일에 존재하도록 허용하므로, "이미지"를 렌더링하면 공격자가 선택한
파일이 서버에서 읽혀 그 내용이 픽셀로 반환된다. 서로의 필드를 볼 수 없는 두 계층에서, 같은 혼동이
두 번 일어난다.
reference/the-attack.md는 인바운드 요청부터 libmatio가 대상 파일을 여는 지점까지 전체 호출 체인을
추적하며, 네 개의 핵심 분기점을 표시한다. 이어서 reference/the-investigation.md는 이 공격이
왜 조사 가능한지를 설명한다. 즉, 이 공격은 강도가 점점 높아지는 세 가지 아티팩트를 남기며,
그중 가장 강력한 것은 렌더링된 variant로, 이는 훔친 바이트를 당신의 자체 오브젝트 스토어에
픽셀 값으로 보관한다.
두 스킬은 순서대로 실행된다. 첫 번째가 노출 기간을 산출하며, 두 번째는 그것 없이는 시작할 수 없다.
| 스킬 | 질문 | 산출물 |
|---|---|---|
kr2s-was-i-vulnerable | 이 애플리케이션이 한 번이라도 노출된 적이 있는가? | 노출 기간과 스윕에 필요한 사실들 |
kr2s-was-i-exploited | 누군가 이를 사용했는가, 그리고 무엇을 얻었는가? | 작성된 포렌식 분석 |
둘 다 에이전트를 위해 작성되었으며, 작업을 직접 수행하려는 사람도 읽을 수 있다. 각각에는
SKILL.md 진입점과 실제 프로세스, 그 eval 검사 및 실패 모드를 담은 references/guide.md가 있다.
패치가 완료되었고 신경 써야 하는지 알고 싶다면 첫 번째를 실행하라. 그 산출물은 예/아니오가 아니라 기간인데, 이 글을 읽는 대부분의 사람에게 현재 시제의 답은 "아니오, 우리는 패치했다"이며, 유용한 답은 조사가 다루어야 할 연도가 언제인지이기 때문이다.
이 저장소를 클론하고 클론을 유지하라. 두 스킬은 reference/의 참조 문서를 공유하며,
그 가이드는 저장소 상대 경로로 이를 읽으므로, 스킬 디렉터리를 단독으로 어딘가에 복사하면
막다른 길에 이르게 된다.
가장 쉬운 방법은 클론 안에서 에이전트를 시작하고 애플리케이션이 어디에 있는지 알려주는 것이다.
AGENTS.md가 거기서부터 방향을 잡아주며, 사람들이 흔히 잘못 이해하는 부분, 즉 이 저장소가
도구이지 대상이 아니라는 점도 포함한다.
그렇지 않으면 파일을 가리키며 그렇게 말하라. 이는 로컬 파일을 읽을 수 있는 모든 에이전트에서 작동한다:
Read /path/to/rails-forensics-CVE-2026-66066/skills/kr2s-was-i-vulnerable/SKILL.md
and follow it. My application is at /path/to/my-app.
Claude Code에서는 복사하는 대신 심볼릭 링크를 만들어 클론을 가리키도록 하면, 자동으로 트리거되도록 설치할 수 있습니다:
ln -s "$PWD/skills/kr2s-was-i-vulnerable" ~/.claude/skills/
ln -s "$PWD/skills/kr2s-was-i-exploited" ~/.claude/skills/
프로젝트 범위로만 적용하고 싶다면 ~/.claude/skills/ 대신 프로젝트 내부의 .claude/skills/를 사용하세요.
어느 쪽이든, 에이전트에게 애플리케이션의 위치를 알려주세요. 스킬에는 이 저장소와 조사 대상 애플리케이션이 서로 다른 두 개의 루트이며, 두 번째 루트는 읽을 수 있지만 절대 쓸 수 없다는 점이 명시되어 있습니다.
AGENTS.md orientation for an agent started in this directory
reference/the-attack.md how the vulnerability works, traced call by call
reference/the-investigation.md why an investigation is possible, and where it runs out
skills/ the two skills
RUNBOOK.md operator's guide to the scanner: flags, verdicts, resuming
lib/crafted_mat_file.rb the detector
bin/ the scanner and three analysis utilities
test/ the test suite
두 참조 문서는 이 저장소의 평이한 영어 절반을 차지하며 그 자체로 완결됩니다. 문제를 이해하고 싶다면 그것들을 읽고, 특정 애플리케이션에 대한 답을 원한다면 스킬을 실행하십시오.
bin/kr2s_scan_active_storage_blobs.rb는 rake build에 의해 lib/에서 생성되어
커밋되므로, 프로덕션에서 실행하는 데 빌드 단계도, 두 번째 파일도 필요하지 않습니다.
lib/crafted_mat_file.rb는 이 공격에 필요한 조작된 파일을 식별합니다. 이 파일은
객체의 처음 128바이트에서 두 개의 헤더 필드를 읽으며 그 외에는 아무것도 필요로 하지
않습니다. 그래서 스캔이 후보를 다운로드하지 않고 범위 읽기로 분류할 수 있습니다.
reference/the-attack.md는 어떤 필드인지, 그리고 왜 정당한 작성자라면 그 조합을
만들어내지 않는지 설명합니다.
이 저장소는 의도적으로 조작된 파일을 만드는 코드도, 조작된 파일도 제공하지 않습니다.
탐지기의 테스트는 탐지기가 읽는 전부인 128바이트의 헤더를 순수 Ruby로 합성합니다.
reference/the-attack.md는 구조를 완전히 설명하므로, 공격을 이해하려는 독자에게서
무언가를 감추고 있는 것은 아닙니다. 감추고 있는 것은 인자 하나를 바꾸면 임의의
경로를 대상으로 재조준될 수 있는 작동하는 생성기입니다.
포함: Active Storage, :vips 변형 프로세서를 사용하는 애플리케이션에서
variant 레코드가 추적된 경우.
미포함: 애플리케이션이 사용자 제공 파일을 libvips에 넘기는 다른 모든 곳.
다른 업로드 라이브러리, 직접적인 객체 저장소 클라이언트, 그리고 맞춤형
아바타나 로고 시스템은 각각 자체적인 점검이 필요하며, 여기 있는 스캐너는
그것을 해주지 않습니다. kr2s-was-i-vulnerable은 결론에서 조용히 빠지는 대신
이름이 명시되도록 그것들을 열거하게 만들 것입니다.
이 도구로 얻은 깨끗한 결과는 강력한 증거이지 증명은 아닙니다. 두 스킬 모두 이 점을 반복해서, 구체적으로 말하며, 분석 템플릿에는 선택 사항이 아닌 한계 섹션이 있습니다.
이것은 37signals에서의 실제 조사에서 나왔으며, 취약점이 존재했던 전체 기간에 걸쳐 대규모 프로덕션 Active Storage 저장소를 점검한 것입니다. 이 도구는 결함을 보고한 보안 연구원들이 업로드한 테스트 파일을 정확히 식별했으며, 이는 탐지기가 찾아야 할 것을 찾는다는 유일한 외부 증거입니다.
kr2s-was-i-exploited/references/analysis-template.md의 예시 분석은
허구입니다. 실제 분석을 모델로 했지만, 그 안의 모든 식별자, 주소, 날짜는
지어낸 것입니다.
패치된 Rails 버전 번호는 여기 적힌 것이 아니라 권고에서 가져오십시오.
mise exec -- rake # build and test
MIT. LICENSE를 참조하세요.