디스코urses 포럼 중 하나를 방금 재구성했는데, 브라우저로 로드하면 팝업에 다음 메시지가 표시됩니다:
플러그인에 의해 해킹되었습니다! by w3shi(Hackerone)-S.라크슈미 비그네시(RCE-POC)
아니… 이게 무슨 일이죠? 제가 사용하는 플러그인 중 하나가 해킹당한 건가요?
디스코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) 관행에 부합하는 행동을 하겠습니다. 이번 일을 통해 배울 수 있는 기회를 주신 점에 감사드립니다.
다시 한번, 제가 일으킨 혼란에 대해 진심으로 사과드립니다.
사과 말씀 감사합니다.
다음으로 다소 책임감 없는 행동은 핸들을 포기할 때 저나 CDCK에게 사적으로 연락하지 않은 것이었습니다. 지난 3시간 동안 다른 누군가가 게시물을 보고 해당 핸들을 등록할 수 있었기 때문입니다.
이제 저는 이전 Github 핸들에 대한 관리를 다시 되찾았습니다. 결국 올바른 조치를 취해 주셨고, Github가 더 이상 리디렉션을 보호하지 않는다는 사실을 다섯 번째로 지적해 주셔서 감사합니다 (지난번은 네 번째였을 때: “이 발견은 대체 방법으로 리포재킹(Repojacking)을 수행할 수 있음을 확인한 네 번째 사례를 나타냅니다”)
Github에 직접 문의하여 보상을 수령하시기를 제안합니다!
모든 불편에 대해 진심으로 사과드립니다! @RGJ 님의 이해에 감사드립니다!
커뮤니티에 오신 것을 환영하며, 모든 것을 정리해 주셔서 감사합니다.
결국 아무것도 안전하지 않다고 가정해야 하는데, 이 또한 잘 작동하지 않습니다.
며칠 전 ESLint Prettier 패키지의 NPM 계정 개발자 중 한 명의 계정이 해킹되어 인기 있는 몇몇 패키지의 새로운 해킹 버전이 게시된 사실이 밝혀졌습니다:
많은 사람들이 항상 최신 버전으로 업데이트해야 한다고 주장하기 때문에, 이 패키지들은 다른 패키지들에서 참조되었습니다.
이 스레드를 본 후, 플러그인/테마 구성 요소를 업데이트할 때 서명 검증을 도입하는 기능을 제안했습니다: Plugin and theme component signing
이 방법은 해킹된 키를 막지는 못하지만, 적어도 공급망의 _일부_를 더 신뢰할 수 있게 만들어 줍니다. 결국 해킹된 서드파티 라이브러리가 포함될 가능성은 여전히 존재합니다. 추가적인 의존성은 실제로는 잘 보이지 않습니다.
이것이 여전히 작동하는지 확실하지 않습니다. 취약점이 노출된 GitHub URL을 가리키는 플러그인이 있었는데, 재빌드 중 오류 메시지는 단순히 리포지토리를 가져오지 못했다고만 표시되었고, 젬 버전이나 다른 사항에 대한 추가 세부 정보가 있었습니다. (이후 빌드 과정에서 발생한 다른 노이즈로 인해 스크롤백에서 해당 정보가 너무 멀리 있어 정확한 내용을 붙여넣을 수 없습니다.)
URL/리포지토리가 이제 아예 존재하지 않는 것으로 보이며, 이는 좋은 일입니다(최소한 다른 누군가가 다시 생성할 때까지). 하지만 그 오류 메시지가 많은 시간을 절약해 주었을 것입니다.
실제로 @RGJ가 이제 GitHub 조직을 다시 관리하고 있으므로, 임시 오류 메시지를 제거했습니다.