
분석 보고서
참고: 이 버그를 Freenet 팀에 완전히 공개하였고, 팀과 함께 패치 검증을 진행했습니다. 해당 패치는 현재 최신 버전의 Freenet에 배포되었습니다.
저는 최근 Freenet에서 공격자가 대상의 익명성을 해제하거나 Freenet을 통해 악성 문서를 전송할 수 있는 보안 취약점을 발견했습니다.
이 취약점은 Firefox를 브라우저로 사용하는 Freenet 사용자에게 영향을 미칩니다. 이는 사용자 컴퓨터에서의 익명성 해제 및 기타 악의적인 행위를 가능하게 합니다. 1483까지의 모든 버전에 존재합니다.
이 익스플로잇은 MIME 유형 처리에 있어 Firefox와 Freenet 간의 불일치를 이용합니다. Freenet은 다양한 콘텐츠 유형에 대한 필터를 제공합니다 – 올바른 형식의 스크립트가 없는 콘텐츠만 사용자에게 여러 경고 없이 렌더링되도록 많은 노력이 투입되었습니다.
Freenet은 일반적으로 데이터를 적절하게 처리하고 사용자가 다른 방식으로 처리하도록 지정할 수 있도록 잘 작동합니다.
반면 Firefox는 파일의 MIME 유형을 결정하는 방식이 다소 복잡합니다. 특히 여기에 문서화된 대로입니다. 이 페이지에 문서화된 프로세스의 대부분은 공격자의 통제를 벗어나며, 특히 Freenet을 통해 공격해야 하는 경우 더욱 그렇습니다. 그러나 공격자의 통제 범위 내에 있는 한 가지는 삽입되는 데이터의 MIME 유형입니다. 데이터가 Freenet 네트워크에 삽입될 때 사용자는 MIME 유형을 지정할 수 있습니다. 이 필드가 null로 남겨지면 데이터는 application/octet-stream으로 처리되어 적절한 경고 처리를 모두 받습니다.
그러나 Mozilla 문서의 HTTP 섹션으로 이동하면 Firefox는 애플리케이션이 콘텐츠를 제공할 때 특정 조건이 충족되지 않으면 데이터의 MIME 유형을 자체적으로 추측한다는 것을 알 수 있습니다. 특히 Content-Encoding 헤더가 애플리케이션에 의해 전송되지 않으면 Firefox는 실제로 콘텐츠를 스니핑하여 처리 방법을 결정합니다. 데이터의 첫 번째 블록이 텍스트가 아닌 경우 Firefox는 파일 확장자에 표시된 MIME 유형으로 파일을 처리합니다.
Freenet이 응답에서 이 헤더를 전송하지 않고 있었기 때문에 이를 사용 가능한 것으로 전환할 수 있었습니다. 데이터를 MIME 유형 text/plain으로 삽입할 수 있습니다. 이는 당연히 정교한 필터링을 받지 않지만 파일 확장자에 표시된 MIME 유형으로 전달될 수 있습니다. 따라서 이제 필터링되지 않은 HTML 문서(또는 PDF, .docx 등)를 전달할 수 있는 방법이 생겼습니다. 이는 큰 문제입니다. 일반적으로 모든 위험한 콘텐츠는 폴더나 임시 공간에 다운로드하여 브라우저 외부에서 열도록 권장되기 때문입니다.
이것은 익스플로잇이 작동하는 모습을 보여주는 짧은 비디오입니다. 이 경우 필터링되지 않은 HTML 파일을 전달합니다.
작동 예제를 보려면 1483 또는 이전 버전을 설치하고 다음으로 이동하세요:
직접 시도해보려면 가장 최근의 취약한 버전의 Freenet을 여기에서 얻을 수 있습니다.
그렇다면 실제 세계에서 이를 어떻게 사용할 수 있을까요?
사용자가 이미 탐색 중인 Freenet 페이지 내에서 악성 콘텐츠에 연결하면 Freenet은 파일을 확장자에 표시된 유형으로 처리합니다. Freenet은 데이터의 첫 번째 비트가 바이너리임을 확인하고 사용자에게 파일이 악성임을 경고합니다.
:(
따라서 대상이 JS가 포함된 악성 페이지를 보게 하려면 외부에서 연결해야 합니다. 이는 실제로 괜찮습니다. Freenet의 가장 인기 있는 메시징 시스템은 Freenet의 웹 프록시에서 작동하지 않기 때문입니다.
예를 들어, 이 글의 데모 URI가 FMS 내에서 연결되면 추가 확인이 없으며 페이로드를 실행할 수 있습니다.
많은 Freenet 사용자의 익명성을 해제하는 데 필요한 것은 흥미로운 제목의 콘텐츠를 만들고, 데이터의 첫 번째 블록이 바이너리인 파일을 삽입한 다음, 백그라운드에서 IP 주소와 활동을 조용히 보고하는 설득력 있는 웹 페이지를 만드는 것입니다. 이를 BeEF 프레임워크와 같은 도구 세트와 결합하면 흥미로운 기회가 생깁니다.
물론 악성 PDF, .docx 또는 기타 파일을 전달하는 벡터로도 사용하여 사용자 컴퓨터에 더 영구적인 발판을 마련할 수 있습니다.
이 버그를 수정하는 것은 매우 간단합니다. 이제부터 FProxy는 콘텐츠를 전달할 때 항상 Content-Encoding HTTP 헤더를 전달합니다. 이 헤더는 Firefox 브라우저가 FProxy에 정의된 대로 MIME 유형을 명시적으로 처리하도록 지시합니다. 결과적으로 text/plain 유형의 데이터는 항상 일반 텍스트로 렌더링되며 다른 MIME 유형으로 처리되지 않습니다.
이 버그는 전반적으로 매우 간단했지만 Freenet의 기능에 큰 영향을 미칠 수 있었습니다. MIME 유형 검사는 정말 중요하며 이 버그에서 배워야 할 주요 교훈은 데이터가 한 프로그램에서 다른 프로그램으로 전달될 때 MIME 유형이 항상 일관되게 처리되지 않는다는 것입니다.
MIME 유형 text/plain과 첫 번째 블록이 바이너리 데이터만 포함하도록 데이터를 Freenet에 삽입하기만 하면 됩니다. Firefox는 파일 확장자가 지정하는 유형으로 처리하며, Freenet에 의해 필터링되지 않고 사용자에게 직접 전달됩니다. FMS나 Frost에서 피해자에게 전송하세요. IP 주소를 수집하거나 바이너리 페이로드를 실행하게 하세요. 이득을 보세요!