SourceHut 빌드 로그 XSS로 계정 탈취, ansi2html의 OSC 8 링크 처리가 발단
- ansi2html은 OSC 8 하이퍼링크 URL을 이스케이프하지 않고
<a href>에 그대로 넣어,␛]8;;https://example.com/“/onfocus=...␇같은 입력이 XSS로 실행되는 취약점을 가짐 - 악성 시퀀스를 넣으려면 공개 메일링리스트에 패치를 보내는 것만으로 충분해 계정이 없어도 되고, 결과는
builds.sr.ht/~someone-else/job/1234567같은 남의 잡 페이지를 여는 모든 브라우저에서 페이로드가 실행됨 - 더 큰 피해는 deploy 키 접근으로, builds.sr.ht에 sr.ht 자체 배포 키가 있어
doas apk upgrade -Ua와doas rc-service *.sr.ht restart권한까지 이어져 빌드만 악성이라 지속적 침해가 가능함 - 발견자 arusekk는 빌드 로그의 중복 CSS 규칙을 고치려고 이슈 pycontribs/ansi2html#259와 PR #260을 먼저 낸 뒤 CTF 경험을 살려 링크 파싱에서 XSS를 추가로 찾아냄
- 저장소는 당시 1년 넘게 활동이 없었고, 잡 직접 제출은 flagship 인스턴스 유료 계정이 필요하지만 CI가 켜진 메일링리스트나 로그에 출력되는 원격 리소스로는 우회 가능함
Hacker News opinions
업스트림 파이썬 프로젝트 패치까지 올린 건 진짜 잘한 일임. 타임라인에 뭐 창피해할 필요 없다.
조율된 공개 일정 같은 걸 제대로 못 한 게 좀 아쉽다. SourceHut 보안 메일링리스트에 처음 보냈을 때 취약점 존재가 업스트림 알기도 전에 공개돼 버렸거든.
SourceHut 좋아하는데 대체할 만한 게 딱히 없다. 근데 소규모 독립 프로젝트는 프로젝트 이력이랑 공격 노출 정도를 같이 봐야 하는 거 아닌가 싶음.
OSC 8 또 터졌네. 내 ansi2html 만들 때는 C0/C1이랑 APC, DCS, OSC, PM 시퀀스를 전부 싹 제거했었다.
OSC 8 하이퍼링크가 표 같은 압축 출력에는 진짜 유용한데 말이지.
빌드 로그는 공격 면으로 진짜 다루기 어렵다. 유용한 포맷 안 부수고 임의 출력을 정화하는 건 사실상 불가능하고 안전하지 않은 입력 전제로 가야 해.
계정도 없는 상황에서 공개 메일링리스트에 악성 패치만 보내면 터지는 거라니 심각한 수준이다.
글 잘 썼다. SourceHut이랑 Drew가 이걸로 보상 제대로 해줬으면 좋겠는데.
나는 돈 없으면 구두 크레딧만으로도 괜찮다고 해서 안 받으면 졸라대진 않을 생각임. 더 찾으면 그때 얘기하지.
deploy 키까지 딸 수 있다는 부분이 가장 의외였다. PKGBUILD에 임의 명령 들어갈 수 있는 잡 도중에 자격증명이 아예 없게 잠그는 게 얼마나 중요한지 다시 느낌.
좀 오해한 것 같은데, 소스코드가 SourceHut에 호스팅돼 있고 CI/CD가 알파인 패키지를 만들어 mirror.sr.ht에 자동 업로드하는 구조야. 문제는 *.sr.ht 배포 키가 프로덕션에서 doas apk upgrade -Ua랑 doas rc-service 재시작 권한을 갖는 거라서 빌드가 키를 잡으면 연속 침해로 이어질 수 있다는 점이지.