폴더 하나 지울 수 있다는 것만으로, SYSTEM 권한까지 갈 수 있었다
폴더 하나 지울 수 있다는 것만으로, SYSTEM 권한까지 갈 수 있었다
분류: Bugbounty · 클라이언트 소프트웨어 · 권한상승(LPE) [정보성]
덱. 연구자 veath1은 ProtonVPN Windows 클라이언트(v3.2.9)의 서비스 프로세스가 일반 사용자 권한으로 쓸 수 있는 폴더를 SYSTEM 권한으로 삭제한다는 사소해 보이는 결함 하나를 발견했습니다. 이 결함은 심볼릭 링크·레이스 컨디션(경쟁 조건) 기법과 결합돼, 결국 일반 사용자가 SYSTEM 권한 명령 프롬프트를 얻는 로컬 권한상승(LPE)으로 이어졌습니다. CVSS 3.1 기준 점수는 7.8(HIGH)로 저장소에 명시돼 있습니다.
리드
윈도우 환경에서 관리자 권한으로 도는 서비스가 일반 사용자도 쓸 수 있는 폴더를 건드릴 때는, “그 폴더에서 무슨 일이 일어나는지”를 서비스가 확신할 수 없다는 전제가 필요합니다. 사용자가 그 폴더의 내용물을 마음대로 바꿔치기할 수 있다면, 서비스가 그 폴더를 삭제·생성하는 아주 짧은 순간에도 끼어들 여지가 생깁니다. “임의 폴더 삭제”라는, 언뜻 파괴적이기만 하고 별 이득은 없어 보이는 결함이 결국 SYSTEM 권한 획득까지 이어지는 이 사례는, 낮아 보이는 권한의 버그도 윈도우의 파일시스템 구조와 만나면 왜 위험해지는지를 보여줍니다.
핵심 사실 요약
- ProtonVPNService.exe는 관리자 수준 권한으로 동작하는 윈도우 서비스지만, 시작·중지는 일반 사용자 권한으로도 가능하게 등록돼 있었습니다. 이 서비스는 실행될 때 사용자의 로컬 데이터 폴더 하위의
AppData\Local\ProtonVPN\Updates폴더를 정리(삭제)하는 동작을 수행했습니다. - 문제는 이 폴더가 일반 사용자 권한으로도 접근·조작 가능한 위치였다는 겁니다. 연구자는 이 폴더 삭제 동작을 oplock(기회적 락) 이라는 윈도우 파일시스템 메커니즘과 결합해 악용했습니다. oplock은 파일이 삭제·수정되기 직전에 콜백을 걸 수 있게 해주는 기능으로, 연구자는 이 콜백이 실행되는 짧은 순간에 삭제 대상 폴더를 다른 곳(
C:\Config.Msi, 윈도우 설치 관리자가 롤백 정보를 저장하는 시스템 폴더)을 가리키는 정션(junction)으로 바꿔치기했습니다. - 그 결과 서비스가 “내가 만든 임시 폴더를 지운다”고 믿고 수행한 삭제 요청이, 실제로는
C:\Config.Msi를 삭제하는 결과로 이어졌습니다. 이 시스템 폴더가 사라지면 Windows Installer가 다음 설치·업데이트 시 이 폴더를 다시 만드는데, 그 순간에 권한이 약한(쓰기 가능한) DACL로 재생성되도록 유도할 수 있었습니다. - 이렇게 확보한 “임의 위치에 임의 파일을 쓸 수 있는” 능력을, 연구자는 ProtonVPNService.exe와 같은 폴더에
profapi.dll이라는 이름의 DLL을 심는 데 사용했습니다. 윈도우 프로세스가 특정 이름의 DLL을 검증 없이 우선 로드하는 관행(DLL 사이드로딩)을 이용해, 서비스가 재시작될 때 공격자가 준비한 DLL이 SYSTEM 권한으로 로드되도록 만들었습니다. - 전체 공격 흐름은 요약하면: ① 서비스가 정리하는
Updates폴더 자리에 링크 파일을 심는다 → ② oplock으로 삭제 시점을 가로채C:\Config.Msi로 리다이렉트한다 → ③ Windows Installer의 롤백 스크립트 처리 과정을 악용해 원하는 위치에 원하는 파일(악성 DLL)을 배치한다 → ④ 서비스가 재시작되며 DLL 사이드로딩으로 SYSTEM 권한 코드가 실행된다. 연구자는 레이스 컨디션 특성상 CPU 코어 수가 부족하면 재현이 불안정할 수 있다고 명시했습니다. - 저장소에는 실제 패치 커밋(
ProtonVPN/win-app, 커밋fc24808c)이 링크돼 있으며, 취약했던 폴더 정리 코드가 제거된 것으로 확인됩니다. ⚠️미확인 — 이 초안에서는 저장소에 링크된 패치 커밋의 존재만 확인했고, 커밋 diff 전체·정확한 패치 배포 버전·CVE 발급 여부는 별도로 1차출처 대조하지 않았습니다.
짧은 논평
이 사례는 저희가 반복해서 짚는 “권한 경계는 코드가 실행되는 위치가 아니라 그 코드가 건드리는 데이터의 소유권 기준으로 그어야 한다”는 원칙의 로컬 버전입니다. SYSTEM 권한 서비스가 문제 삼은 폴더는 코드상으로는 “우리 앱의 폴더”였지만, 실제 파일시스템 권한상으로는 사용자가 통제하는 영역이었습니다. 이 간극(코드의 가정 vs 실제 권한 경계)이 레이스 컨디션이라는 시간의 틈과 만나면 임의 삭제 하나가 SYSTEM 셸로 확장됩니다. Windows Installer의 롤백 폴더(C:\Config.Msi)를 경유하는 패턴은 윈도우 LPE 리서치에서 반복적으로 등장하는 관용구이기도 합니다 — 임의 폴더/파일 삭제 결함을 만나면 “이게 결국 어디로 연결될 수 있는가”를 늘 시스템 전역 신뢰 지점(설치 관리자, 업데이트 파이프라인)까지 따라가 보는 습관이 필요하다는 교훈입니다.
References / 참고자료
- veath1, “ProtonVPN For Windows Local Privilege Escalation Vulnerability” — 이 글이 재구성한 원 분석. 임의 폴더 삭제 취약점 발견부터 DLL 사이드로딩을 통한 SYSTEM 권한 획득까지 전 과정과 패치 커밋을 다룸. https://github.com/veath1/ProtonVPN_For_Windows-LPE
이 글은 위 원 분석을 우리 관점에서 다시 쓰고 짧은 논평을 더한 정보성 초안입니다. 특정 문장·코드·스크린샷을 그대로 옮기지 않았으며, 작동하는 재현 절차는 싣지 않았습니다. ⚠️미확인 표시 항목은 발행 전 독립 팩트체크에서 확증·정정되어야 합니다.