서드파티 플러그인 저장소 탈취

디스코urses 포럼 중 하나를 방금 재구성했는데, 브라우저로 로드하면 팝업에 다음 메시지가 표시됩니다:

플러그인에 의해 해킹되었습니다! by w3shi(Hackerone)-S.라크슈미 비그네시(RCE-POC)

아니… 이게 무슨 일이죠? 제가 사용하는 플러그인 중 하나가 해킹당한 건가요?

migrate password 플러그인을 사용하셨을 가능성이 있나요? 아니면 discoursehosting 저장소의 다른 플러그인을 사용하셨나요?

이 포럼도 영향을 받은 것으로 보입니다. Am I hacked? or not - Forum Management - Suggestions - DxO Forum

네, 목록에 있습니다. 그리고 discoursehosting에서 가져온 유일한 플러그인입니다.

이 플러그인은 “구식” 사용자의 로그인을 허용하려면 활성화되어 있어야 한다고 기억하고 있는데, 맞나요?

하지만 지금의 질문은 설치가 해킹당한 것인지, 아니면 단순히 이 메시지가 표시되고 있는 것인지에 더 가깝습니다. 지금은 안전을 위해 사이트를 일시적으로 중단했습니다.

해당 플러그인과 함께 제가 사용하는 목록은 다음과 같습니다:

discoursehosting에 대한 언급은 모두 제거하세요.

프랑스어 포럼 게시글의 구글 번역 결과:

가짜 보안 연구자가 포럼에서 사용 중인 플러그인의 오래된 Git 저장소를 가져와 단순히 이 메시지를 표시하도록 탈취했습니다.

해당 저장소(GitHub - discoursehosting/discourse-migratepassword: A touch of security)를 검사해 보았지만 악성 코드는 존재하지 않습니다(단순히 개념 증명용입니다).

이 저장소는 실제로 URL이 변경되었습니다(현재는 GitHub - communiteq/discourse-migratepassword: Support migrated password hashes에서 사용할 수 있습니다). 사용자는 이전에 communiteq/discourse-migratepassword로 리디렉션되던 discoursehosting/discourse-migratepassword 저장소를 다시 생성하여 관련 없는 코드를 넣었습니다. 우리는 이전 URL을 사용 중이어서 영향을 받았습니다.

만약 이것이 사실이라면, 좋습니다… 플러그인 URL을 communiteq으로 변경하고 현재 재빌드 중입니다. 하지만 이 문제에 대해 더 자세히 살펴봐야 합니다(프로그래머가 아니므로 100% 확신할 수 없기 때문입니다).

요약

이것은 "Repojacking"이라는 익스플로잇 클래스에 해당하는 GitHub 취약점입니다.

모든 사용자에게 GitHub 플러그인 URL을 확인하고, discoursehosting의 모든 인스턴스를 communiteq으로 이름 변경할 것을 권장합니다.

배경:

우리는 2019년에 회사명을 Discoursehosting에서 Communiteq으로 변경해야 했습니다.
이런 상황이 발생하면, GitHub은 저장소 URL을 자동으로 새 위치로 리디렉션합니다. 다만 누군가 동일한 이름의 저장소를 생성하는 순간까지는요. 그 시점에 새로운 저장소가 우선권을 갖게 됩니다.

GitHub은 과거에 이러한 저장소를 “retired”(폐쇄됨)로 표시하고 동일한 이름의 저장소 생성을 금지했습니다.

이전 익스플로잇에 대한 설명은 여기에 있습니다. 그런데 Apparently 해당 수정안이 더 이상 유효하지 않은 것으로 보입니다.

우리는 GitHub 악용 신고를 접수했으며, 모든 가용한 수단을 동원하여 이 저장소를 삭제하는 데 노력할 것입니다.

현재 해당 플러그인은 메시지만 표시하고 /tmp에 무해한 파일을 남기는 상태입니다.
아직까지는 큰 문제가 발생하지 않았습니다. 재빌드하기 전에 플러그인 URL을 변경하는 것이 중요합니다.

와, 이건 최종 사용자를 쉽게 함정에 빠뜨릴 수 있네요. discourse.org 공식 호스팅을 사용하지 않는 것의 주요 단점 중 하나입니다.

angusmcleod (Angus McLeod) · GitHub 또는 merefield (Robert) · GitHub

계정 중 어느 하나가 삭제되는 경우

첫 번째 서브패스(sub-path)가 노출되게 되어, 재빌드 시 실행될 클론 명령어가 내 app.yml 파일에 남아 있게 됩니다.

표준 설치 사용자에게 미칠 수 있는 잠재적 영향을 완화하기 위해, github.com/discoursehosting/을 감지하고 재빌드/업그레이드를 중단하는 코드를 추가했습니다.

에러는 다음과 같은 형태가 될 수 있습니다.

---
ERROR: The configuration file containers/app.yml contains references to a compromised github organization: github.com/discoursehosting
Please remove any references to this organization from your configuration file.
For more information, see https://meta.discourse.org/t/374703/6
---

데이비드, 고마워요!

디스코urse 커뮤니티 여러분께,

플러그인 저장소와 관련하여 저의 행동으로 인해 불편을 드린 점 진심으로 사과드립니다. 보안 문제를 지적하려는 의도였으나, 행동 규범을 위반하는 심각한 실수를 저질렀습니다.

앞으로 책임 있는 공개(Responsible Disclosure) 관행에 부합하는 행동을 하겠습니다. 이번 일을 통해 배울 수 있는 기회를 주신 점에 감사드립니다.

다시 한번, 제가 일으킨 혼란에 대해 진심으로 사과드립니다.

@w3shi

사과 말씀 감사합니다.

다음으로 다소 책임감 없는 행동은 핸들을 포기할 때 저나 CDCK에게 사적으로 연락하지 않은 것이었습니다. 지난 3시간 동안 다른 누군가가 게시물을 보고 해당 핸들을 등록할 수 있었기 때문입니다.

이제 저는 이전 Github 핸들에 대한 관리를 다시 되찾았습니다. 결국 올바른 조치를 취해 주셨고, Github가 더 이상 리디렉션을 보호하지 않는다는 사실을 다섯 번째로 지적해 주셔서 감사합니다 (지난번은 네 번째였을 때: “이 발견은 대체 방법으로 리포재킹(Repojacking)을 수행할 수 있음을 확인한 네 번째 사례를 나타냅니다”)

Github에 직접 문의하여 보상을 수령하시기를 제안합니다!

모든 불편에 대해 진심으로 사과드립니다! @RGJ 님의 이해에 감사드립니다!

커뮤니티에 오신 것을 환영하며, 모든 것을 정리해 주셔서 감사합니다.

결국 아무것도 안전하지 않다고 가정해야 하는데, 이 또한 잘 작동하지 않습니다.

며칠 전 ESLint Prettier 패키지의 NPM 계정 개발자 중 한 명의 계정이 해킹되어 인기 있는 몇몇 패키지의 새로운 해킹 버전이 게시된 사실이 밝혀졌습니다:

많은 사람들이 항상 최신 버전으로 업데이트해야 한다고 주장하기 때문에, 이 패키지들은 다른 패키지들에서 참조되었습니다.

이 스레드를 본 후, 플러그인/테마 구성 요소를 업데이트할 때 서명 검증을 도입하는 기능을 제안했습니다: Plugin and theme component signing

이 방법은 해킹된 키를 막지는 못하지만, 적어도 공급망의 _일부_를 더 신뢰할 수 있게 만들어 줍니다. 결국 해킹된 서드파티 라이브러리가 포함될 가능성은 여전히 존재합니다. 추가적인 의존성은 실제로는 잘 보이지 않습니다.

이것이 여전히 작동하는지 확실하지 않습니다. 취약점이 노출된 GitHub URL을 가리키는 플러그인이 있었는데, 재빌드 중 오류 메시지는 단순히 리포지토리를 가져오지 못했다고만 표시되었고, 젬 버전이나 다른 사항에 대한 추가 세부 정보가 있었습니다. (이후 빌드 과정에서 발생한 다른 노이즈로 인해 스크롤백에서 해당 정보가 너무 멀리 있어 정확한 내용을 붙여넣을 수 없습니다.)

URL/리포지토리가 이제 아예 존재하지 않는 것으로 보이며, 이는 좋은 일입니다(최소한 다른 누군가가 다시 생성할 때까지). 하지만 그 오류 메시지가 많은 시간을 절약해 주었을 것입니다.

실제로 @RGJ가 이제 GitHub 조직을 다시 관리하고 있으므로, 임시 오류 메시지를 제거했습니다.