KDE Plasma에서 샌드박스를 깨는 임의 코드 실행 취약점

2 hours ago 2
  • KDE Plasma의 창 관리 동작 때문에 샌드박스된 앱이 사용자의 클릭을 계기로 호스트 임의 바이너리를 실행할 수 있음이 PoC로 확인됨
  • 핵심 원인은 KWin이 앱이 제공한 app_id를 신뢰하고, 실제 .desktop 파일 매칭 없이 /proc/PID/cmdline 기반 실행 경로를 남겨둔 데 있음
  • PoC는 Arch Linux 호스트와 Flatpak 앱, 수정된 Mesa eglgears_wayland를 조합해 /usr/bin/kcalc가 샌드박스 밖에서 실행되는 흐름을 재현함
  • 사용자가 작업 표시줄 아이콘의 Open New Window를 선택하거나 중간 클릭하면 대상 프로세스가 app.slice cgroup과 호스트 마운트 네임스페이스에서 노출된 상태로 시작됨
  • 완화하려면 샌드박스의 security context, XdpAppInfo, control groups에서 앱 ID를 확인하고, .desktop 파일과 맞지 않는 창에는 새 창 실행을 막아야 함

PoC가 보여준 샌드박스 탈출 흐름

  • 악성 샌드박스 앱은 사용자가 Open New Window를 호출하는 순간 다른 앱으로 가장해 호스트에서 임의 바이너리를 실행할 수 있음
  • PoC는 Flatpak으로 재현됐지만, 보안 컨텍스트 지원 여부와 관계없이 다른 샌드박스에도 적용될 수 있다고 정리함
  • 실험 구성은 다음과 같음
    • Arch Linux 호스트
    • 빌드 의존성 wget, unzip, meson
    • 권한을 부여하지 않은 Flatpak 앱 io.github.johannesboehler2.BmiCalculator
    • 샌드박스 안에서 빌드가 쉽지 않아 악성 바이너리 경로만 Flatpak에 전달
    • 지정 대상 바이너리 /usr/bin/kcalc
  • 악성 바이너리를 실행하면 작업 표시줄에는 KCalc 아이콘이 표시됨
  • 사용자가 우클릭 후 Open New Window를 선택하면 /usr/bin/kcalc가 샌드박스 밖에서 시작됨
    • 실행 위치는 app.slice cgroup
    • 마운트 네임스페이스는 호스트 쪽
    • 결과적으로 완전히 노출된 상태로 실행됨

발견 과정과 단서

  • KDE Plasma에서 Portable 샌드박스를 QEMU 가상 머신으로 테스트하던 중, 일부 창이 적절한 .desktop 파일과 연결되지 않아 작업 표시줄에 일반 Wayland 아이콘으로 표시됨
  • 이 현상은 KWin trusts on Apps fully for app_id로 보고됐으며, 앱이 다른 앱으로 가장할 수 있는 문제로 이어짐
  • 이후 작업 표시줄에서 실수로 중간 클릭을 하자 기본 동작으로 Open New Window가 호출됨
  • 새 창은 실행됐지만 저장된 로그인 자격 증명과 수정된 설정을 사용하지 않았고, KWin Debug Console의 PID와 procfs의 control groups 및 rootfs 정보를 함께 확인하면서 샌드박스 탈출이 드러남

취약점의 작동 방식

  • KWin이 창을 실제 .desktop 파일에 연결하지 못하더라도, 실행할 argv0를 찾는 경로가 남아 있음
  • 실험 결과 /proc/PID/cmdline을 통해 값을 읽는다는 추측이 맞았음
  • 문제는 기존 애플리케이션 인스턴스를 샌드박스 밖에서 실행하는 수준에 그치지 않음
  • 권한 없는 프로세스를 포함한 모든 프로세스는 argv0를 바꿀 수 있음
    • 마운트 네임스페이스도 선택지가 될 수 있지만 덜 유연하다고 정리함
  • 앱 제공 app_id에 대한 보호 부재와 /proc/PID/cmdline 읽기의 불안전성이 결합해 호스트에서 임의 코드 실행이 가능해짐

데모와 실제 공격 시나리오

  • 데모 코드는 GalaxySnail이 작성했으며, Mesa의 eglgears-wayland를 사용함
  • 데모 흐름은 다음과 같음
    • mesa-demos-argv0 저장소를 클론
    • src/egl/opengl/eglgears.c의 main 함수 안 지정 명령을 원하는 명령으로 수정
    • meson setup build && meson compile -C build로 빌드
    • ./build/src/egl/opengl/eglgears_wayland 실행
    • 작업 표시줄 아이콘 중간 클릭 또는 컨텍스트 메뉴에서 Open New Window 선택
    • 지정한 악성 바이너리가 시작됨
  • 실제 공격에서는 $HOME 아래에 셸 스크립트를 생성하는 방식이 가능함
    • $HOME은 일반적으로 호스트에서도 같은 경로에 있음
    • 악성 앱은 argv0를 조용히 생성하거나 다운로드한 바이너리로 바꿀 수 있음
    • 사용자가 Open New Window를 클릭하거나 실수로 앱 아이콘을 중간 클릭하면 세션을 완전히 제어할 수 있음

제안된 수정 방향

  • KDE Plasma가 이 익스플로잇을 막으려면 앱이 제공한 ID를 그대로 신뢰하지 않아야 함
  • 앱 ID는 다음 경로에서 얻어야 한다고 제안함
    • 샌드박스의 security context
    • XdpAppInfo
    • control groups
  • 특정 창이 .desktop 파일과 매칭되지 않으면 Open New Window를 허용하지 않아야 함
  • KDE Security 메일로부터 업데이트를 받지 못한 상태임

공개 타임라인

  • 원래 메일에서 arbitrary code execution을 RCE로 잘못 표기함
  • 모든 이벤트는 UTC+8, 24시간 형식 기준임
  • 2026년 4월 1일 23:51, 첫 메일을 security@kde.org로 보냄
  • 2026년 4월 2일 00:15, David Edmundson이 보고를 확인하는 답장을 보냄
  • 2026년 4월 2일 00:24, David Edmundson은 해당 기능이 .desktop 파일의 Exec=를 사용하며 임의 코드 실행에 쓰일 수 없다고 생각한다고 답함
  • 2026년 4월 2일 11:59, GalaxySnail의 도움으로 .desktop 파일에 의존하지 않는 다른 PoC가 동작함을 확인함
  • 2026년 4월 2일 18:26, 익스플로잇 파일과 설명을 포함한 후속 메일을 security@kde.org로 보냈지만 응답을 받지 못함
  • 2026년 5월 2일 11:59, Plasma 6.7 Beta에서 익스플로잇이 패치되지 않았음을 확인함
  • 2026년 7월 2일 18:30, 익스플로잇이 활성 상태로 90일 대기 기간을 넘겨 공개를 진행함
  • 패치되지 않았고 후속 답장을 받지 못했으며 일반적인 90일 대기 기간이 지난 뒤, 인식 제고를 위해 공개를 결정함
  • KDE 개발자를 비판하려는 시도는 아니며, OSS 프로젝트가 최근 스팸에 시달리고 인간에게도 처리 용량의 한계가 있지만 프로세스는 더 나아질 수 있다고 덧붙임
Read Entire Article