
CVE-2026-92162에 대한 교육용 분석 및 테스트 모드 PoC로, Flatpak의 DeployAppstream arch 파라미터에서 발생하는 경로 순회 취약점으로 루트 디렉터리 생성이 가능합니다.
Flatpak 시스템 헬퍼(flatpak-system-helper)의 경로 순회 취약점에 대한 교육용 분석 및 테스트 모드 개념 증명입니다. DeployAppstream D-Bus 메서드는 arch 문자열을 받아 파일 시스템 경로에 삽입하고 검증 없이 root 권한으로 생성합니다. 활성 로컬 사용자는 ../ 구성 요소를 제공하여 root 권한 서비스가 의도된 appstream 트리 외부에 디렉터리를 생성하도록 할 수 있습니다.
이 저장소는 전체 기술 분석 및 연구 사후 분석을 동반합니다. 이는 교육, 메커니즘을 이해하려는 방어자, 그리고 소유하거나 서면 허가를 받은 시스템에서의 승인된 테스트를 위해 존재합니다.
이 자료는 조정된 공개와 수정된 Flatpak 릴리스가 제공된 후에 게시됩니다. 개념 증명은 소유하거나 명시적으로 테스트 권한을 받은 랩 머신에 대해서만 실행하십시오. 통제하지 않는 시스템에 대해서는 실행하지 마십시오. 법률과 보유한 승인 범위를 준수할 책임은 귀하에게 있습니다.
시스템 헬퍼의 handle_deploy_appstream()은 origin 인수를 검증하지만 arch 인수는 검증하지 않습니다. OCI 원격의 경우 arch는 flatpak_build_file로 전달되고 그 다음 g_mkdir_with_parents로 전달되며, 이는 root로 실행되고 ../를 어휘적으로 해석합니다. 이 메서드의 polkit 액션은 org.freedesktop.Flatpak.appstream-update이며 allow_active=yes이므로, 활성 로컬 세션은 비밀번호 프롬프트 없이 코드에 도달합니다. fedora 원격이 있는 기본 Fedora Workstation과 같이 이미 OCI 원격이 있는 시스템에서 낮은 권한의 사용자는 임의 경로에 root 소유 디렉터리를 생성할 수 있습니다. 이 저장소의 페이로드는 /root/.ssh 자체를 대상으로 합니다.
이 취약점인 Finding A는 통제되고 승인된 랩에서 인증되지 않은 로컬 사용자에서 머신의 root로 권한을 상승시키는 데 사용된 두 가지 취약점 체인의 일부로 시연되었습니다. 체인은 다음과 같이 작동합니다: Finding A는 root로 /root/.ssh를 생성합니다. Finding B, 즉 2차 쓰기 프리미티브는 그 디렉터리에 공격자가 제어하는 콘텐츠를 쓸 수 있습니다. 함께 결합하면 공격자가 선택한 경로에 root 소유 파일을 제공합니다. 각 버그는 단독으로는 제한적입니다: Finding A는 디렉터리만 생성하고, Finding B는 상위 디렉터리가 이미 존재하는 곳에만 쓸 수 있습니다. Finding A는 Finding B가 필요로 하는 상위 디렉터리를 제공하고, 이 쌍은 root 파일 쓰기가 됩니다.
Finding B는 이 연구에 의해 독립적으로 식별되었지만, 새로운 발견은 아닙니다: 이는 연구 사후 분석에 문서화된 Deploy의 추가 데이터 쓰기 경로에서 알려진, 아직 패치되지 않은 약점입니다. 따라서 이 분석은 Finding A를 다루고 이에 대한 공로를 인정하며, Finding B는 체인이 의존하는 알려진, 패치되지 않은 구성 요소로만 사용합니다.
이 저장소는 Finding A만을 시연합니다. 체이닝 방법론과 방어적 교훈은 연구 사후 분석에 문서화되어 있습니다.
프로젝트는 이미 아키텍처 이름을 [A-Za-z0-9_]로 제한하는 flatpak_is_valid_arch를 제공합니다. 해결책은 핸들러 경계와 경로 구축 헬퍼 내부에서 arch 인수에 이를 호출하는 것입니다. ../ 값은 그 술어를 통과할 수 없습니다. 수정된 Flatpak 릴리스로 업데이트하십시오.
.
├── README.md 이 파일.
├── requirements.txt PoC를 위한 시스템 패키지 필수 조건.
└── poc_arch_traversal.sh 검증되지 않은 arch 매개변수에 대한 PoC.
기본적으로 샌드박스 테스트 모드, 프로덕션
모드는 /root/.ssh를 대상으로 함. 교육용으로만 사용.
requirements.txt 패키지가 존재하는 Linux 머신.allow_active=yes에 의존하기 때문입니다. 다음으로 확인하십시오:
loginctl list-sessions를 실행하고 세션에 seat가 표시되는지 확인하십시오./usr/libexec/flatpak-system-helper를 사용합니다. 스크립트는 먼저 Flatpak 소스 트리의 builddir/ 또는 _build/에서 새로 빌드된 헬퍼를 찾고, FLATPAK_SYSTEM_HELPER가 모든 것을 재정의합니다. 필요한 시스템 패키지는 requirements.txt를 참조하십시오.프로덕션 모드는 시스템 설치에서 기존 OCI 원격을 자동 감지하여 사용합니다. 가짜이거나 접근할 수 없는 원격이라도 모든 OCI 원격이 작동합니다. mkdir이 레지스트리에 접속되기 전에 발생하기 때문입니다. OCI 원격이 없으면 스크립트는 "No OCI remote found" 메시지와 함께 취소되고 아무것도 전송하지 않습니다.
Fedora Workstation은 이미 OCI fedora 원격을 제공하므로 아무것도 할 필요가 없습니다. flatpak remotes --system으로 존재하는 것을 확인하십시오(OCI 원격은 옵션 열에 oci를 표시합니다).
이것은 전체 흐름에서 sudo가 필요한 유일한 명령이며, 스크립트는 절대 대신 실행하지 않습니다. 다음으로 추가하십시오:
sudo flatpak remote-add --system --no-gpg-verify oci-poc oci+http://127.0.0.1:19876
(flatpak에는 --oci 플래그가 없습니다, 적어도 이 작업의 기반이 된 버전인 1.19.0까지는; oci+ URL 접두사가 원격을 OCI 레지스트리로 만드는 것입니다.) 레지스트리가 실행되지 않을 때 "Warning: Could not update extra metadata" 메시지가 예상됩니다; 원격은 여전히 추가됩니다.
bash poc_arch_traversal.sh
스크립트는 임시 디렉터리 아래에서 개인 D-Bus 버스와 --session 모드의 헬퍼를 시작합니다. 페이로드 ../../../../../root/.ssh로 DeployAppstream을 호출하고 탈출된 디렉터리가 실제 대상과 동일하게 <workdir>/root/.ssh에 생성되었는지 확인합니다. 출력 중간에 D-Bus 오류가 예상됩니다: 이는 디렉터리가 이미 생성된 후 OCI 인덱스 가져오기가 실패한 것이며 예상된 동작입니다.
bash poc_arch_traversal.sh prod
스크립트는 비밀번호를 요청하지 않습니다. OCI 원격을 자동 감지하고, 순회 페이로드로 인증 없이 DeployAppstream을 트리거하고, 헬퍼의 응답을 출력합니다. root 헬퍼는 /root/.ssh를 생성한 다음 접근할 수 없는 레지스트리에서 실패하여 예상된 D-Bus 오류를 출력합니다. 응답이 대신 인증 오류인 경우, 활성 로컬 세션에 있지 않은 것입니다; 머신의 콘솔에서 실행하십시오. 특정 원격은 bash poc_arch_traversal.sh prod <remote>로 강제할 수 있습니다.
트리거 자체는 비권한으로 실행되지만, 결과를 확인하려면 root가 필요하므로 스크립트는 이를 귀하에게 맡깁니다. 실행 후 같은 머신에서:
sudo ls -laR /root/.ssh
sudo stat -c '%U:%G' /root/.ssh
디렉터리가 존재하고 root:root가 소유해야 합니다. 스크립트 출력의 D-Bus 오류는 실패가 아닙니다: 메서드 호출이 실패했음에도 탈출된 디렉터리가 존재하므로 mkdir이 가져오기 전에 실행되었음을 증명합니다.
실행 전에 /root/.ssh가 이미 존재했다면(예: sshd가 실행 중인 호스트에서), 실행은 해당 경로에 대해 아무 작업도 하지 않고 아무것도 남기지 않습니다: 헬퍼의 lock 파일은 일시적이며 메서드가 반환될 때 제거되고, icons는 성공적인 인덱스 가져오기 후에만 기록됩니다. 깨끗한 검증을 위해서는 아직 존재하지 않는 경로에 대해 실행하십시오.
sudo rm -rf /root/.ssh # 실행 전에 존재하지 않았던 경우에만
sudo flatpak remote-delete --system oci-poc
연구 및 분석: Yehia Ali Mohamed Ezzat.
이 저장소의 문서와 코드는 교육 목적으로 제공됩니다. 자신의 책임하에, 그리고 권한이 있는 곳에서만 사용하십시오.