채팅 플러그인을 통해 다른 사용자의 IP를 확인할 수 있음 (핫링크 방지 기능 수정)

(이전에는 보안 채널을 통해 보고되었으나, 기각되었고, 이제 책임 있는 공개 프로세스에 따라 공개적으로 공개합니다)

요약 / 요청

사용자로서, 채팅에 게시된 핫링크 이미지가 서버에 의해 캐시된 후에 나에게 표시되기를 원합니다. 이를 통해 악의적인 제3자 이미지 호스팅 서버로부터 내 IP를 보호할 수 있습니다. 다만, 캐시/프록시된 이미지는 여전히 보고 싶습니다!

Discourse에는 이미 이 기능을 위한 설정이 있지만, 채팅에는 올바르게 적용되지 않습니다. 관련 핫링크 설정 두 가지(아래 참조)를 모두 활성화하면 포럼과 동일한 방식으로 작동해야 합니다. 즉, 제3자가 호스팅하는 이미지가 서버로 다운로드된 후에야 사용자에게 표시되어야 합니다.

배경 / 영향

인터넷 포럼의 초기 시절에는 사용자가 제3자 서버에서 이미지를 "핫링크"하여 이미지 임베드를 게시하는 것이 매우 인기가 있었습니다.

이러한 관행은 오래된 포럼에서 꽤 흔했지만, 인터넷이 발전하면서 이것이 나쁜 관행임이 밝혀졌습니다. 거의 모든 소셜 미디어 플랫폼은 이를 방지하기 위해 진화했습니다. 그 이유 중 하나는 깨지거나 사라진 이미지 문제나 작은 서버의 과부하를 피하기 위해서였지만, 매우 중요한 보안 고려 사항도 있습니다:

사용자가 외부 서버의 이미지를 게시하면 해당 이미지가 링크된 서버에서 다운로드됩니다. 이로 인해 악의적인 제3자 서버가 사용자의 IP를 기록할 수 있습니다. 이는 매우 문제적입니다. 서버를 악의적인 사용자가 운영한다면, 그들은 이제 다른 사용자의 IP를 알게 되기 때문입니다. (악의적인 사용자가 당신의 가정용 IP를 알아내기 위해 메시지를 보내는 상황을 상상해 보세요)

도난당한 IP는 악의적인 개인이 사용자의 진정한 신원을 파악하거나 가정용 라우터/PC의 취약점을 스캔하는 데 사용될 수 있습니다. 또한 다른 사이트에 XSS 취약점이 있다면 이를 통해 XSS 공격을 수행할 수도 있습니다.

이것이 거의 모든 주요 소셜 네트워크(Twitter, Discord, Facebook 등)가 보안상의 이유로 더 이상 이미지 핫링크를 지원하지 않는 이유입니다. 이제 모든 제3자 이미지는 사용자가 직접 가져오지 않고 서버에 캐시됩니다.

관련 Discourse 설정

Discourse는 두 가지 관련 설정을 제공합니다:

Block hotlinked media(핫링크 미디어 차단)는 핫링크 이미지를 텍스트 링크로 대체합니다.

Download remote images to local(원격 이미지를 로컬로 다운로드)은 핫링크 이미지를 로컬로 저장된 이미지로 변환합니다.

포럼에서의 설정 동작

:white_check_mark: 이 두 설정을 모두 활성화하면, 제한적인 테스트에서 포럼이 예상대로 작동하는 것으로 보입니다. 외부 이미지는 다른 사용자에게 표시되기 전에 로컬 이미지로 변환되어 사용자의 IP를 보호합니다. 동작을 확인하기 위해 광범위한 타이밍 공격을 시도하지는 않았지만, 적어도 제한적인 테스트에서는 올바르게 작동했습니다.

(이는 Twitter/Discord/Facebook 등의 동작과 유사하게, 현대적인 소셜 플랫폼이라면 기대할 수 있는 동작입니다)

채팅에서의 설정 동작

채팅에서는 유사한 동작을 얻지 못했습니다. 어떤 설정 조합으로도 만족스러운 결과를 얻을 수 없습니다:

:cross_mark: 두 설정을 모두 활성화하면 원격 이미지가 링크로만 변환됩니다. 그러나 이미지가 여전히 다른 사용자에게 표시되고 웹 요청이 발생하여 사용자 IP가 다른 사용자에게 노출되는 매우 짧은 시간 창이 있습니다. 이는 사실상 최악의 결과입니다. 사용자 IP가 노출되고 이미지도 볼 수 없기 때문입니다.

:cross_mark: Block hotlinked media를 비활성화하고 Download remote images to local을 활성화하면 단순히 핫링크만 수행합니다. 원격 이미지가 실제로 다운로드되지 않는 것으로 보였습니다. 취약점은 아니지만 버그로 보입니다.

:cross_mark: Block hotlinked media를 활성화하고 Download remote images to local을 비활성화하면, 두 설정을 모두 활성화한 것과 동일한 동작을 보입니다. 이미지 대신 링크로 표시되지만, 이미지는 때때로 원격 클라이언트에 의해 가져와져 IP가 노출됩니다. (이미지가 처음 전송될 때는 차단되지만, 두 번째에는 잠시 차단되지 않거나, 다른 타이밍 관련 문제가 자주 발생하는 것을 발견했습니다.)

(오늘 git에서 개발 체크아웃으로 재테스트함: 3.5.0.beta8-dev (2c0635ee4c))

공개 / 응답

이전에 (2024년) 이메일과 hackerone을 통해 이 문제를 보고했으나, 보안 문제가 아니라는 답변을 받았고, 보안 보고서(2844784)는 불행히도 기각되었습니다. 당시 관련 진술은 다음과 같았습니다:

보고해 주셔서 감사합니다. 신중한 검토 후, 설명된 동작은 보안 취약점이라기보다 표준 웹 기능이기 때문에 이 보고서를 닫겠습니다.

브라우저가 외부 리소스(이미지, 스크립트 등)를 로드할 때 호스팅 서버에 요청을 수행하는 것은 필수적입니다. 이 서버는 당연히 요청한 IP 주소를 확인하게 되며, 이는 인터넷 작동 방식의 기본 사항이며 자체적으로 보안 취약점으로 간주되지 않습니다. IP 주소는 일부 맥락에서 개인 정보로 간주될 수 있지만, 표준 웹 요청을 통한 그 노출은 사용자가 인터넷을 탐색할 때 묵시적으로 수용하는 예상되는 동작입니다.

Discourse의 핫링크 보호는 호스팅된 콘텐츠의 무단 재사용을 방지하기 위한 것이며, 외부 서버로부터 사용자 IP 주소를 숨기기 위한 것이 아닙니다.

이것이 핫링크 차단 기능의 의도된 사용 사례일 수 있지만, 이 문제를 다루지 않는 것이 채팅 플러그인 사용자를 위험에 빠뜨린다고 생각합니다. 특히 적의 가정용 IP를 찾아내어 도스(Doxxing)/DDoS 공격을 시도할 수 있는 사용자가 있을 수 있는 더 무질서한 커뮤니티에서 더욱 그러합니다.

또한, 현대 시대에 신뢰할 수 있는 포럼 사이트에서 신뢰할 수 없는 핫링크 URL에 접근하는 것에 대해 사용자가 묵시적으로 동의한다는 아이디어에도 반대합니다. GDPR 등의 영향에 대해서는 잘 모르기 때문에 언급하지 않겠지만, 기본적인 프라이버시 기대감만으로도 이는 매우 오래된 포럼을 제외하고는 예상되지 않는 일입니다. 당연히 현대적인 포럼에서는 더더욱 아닙니다.

2024년 11월 22일에 이 문제에 대해 이 포럼에 공개적으로 게시할 의도를 통보했으나, 그 이후로 아무 응답을 받지 못했습니다.

다른 Discourse 관리자가 이 사실을 인지하고, 엔지니어링 팀이 핫링크 보호를 개선하도록 장려하기를 바라며 여기에 게시합니다. 오랜 시간이 지났고 개선이 없었기 때문에, 이 문제의 중요성에 대한 인식과 커뮤니티의 장려가 개선으로 이어지기를 바라며 선의의 마음으로 게시합니다.


읽어 주셔서 감사합니다 :slight_smile:

3개의 좋아요

상세한 보고 감사합니다. 팀이 향후 몇 주 동안 이 문제를 살펴보고, 해당 벡터를 차단하는 데 어떤 작업이 필요한지 확인하겠습니다.

사이트 설정은 제품 전체에서 균일하게 작동해야 하며, 특정 주제에만 국한되지 않아야 한다는 점에 동의합니다.

3개의 좋아요

궁금한 점이 있는데, 이 버그는 아직 해결/수정되었나요? 채팅 기능에서 IP 주소가 어떤 형태로든 노출되는 것은 심각한 취약점으로 보입니다. 감사합니다!

2개의 좋아요

글을 다시 올리는 건 아닐까 걱정되지만, 아직 명확한 답변이 없어서 이 문제를 완화할 수 있는 단계나 방법이 있는지 궁금합니다.

1개의 좋아요

2024년에 이 취약점을 보고했는데 아직도 수정이 안 됐다는 게 좀 놀랍네요 :sweat_smile:

1개의 좋아요

동의합니다. IP 주소 노출처럼 심각한 문제에 대해서는 개발팀이 최소한 응답을 해야 마땅하다고 생각합니다. :thinking: Discourse는 훌륭한 소프트웨어이지만, 이건 정말 큰 문제입니다…

1개의 좋아요