본문 바로가기
FrontEnd/JavaScript

Security Vulnerability: SSRF(Server-Side Request Forgery in axios)

by 위그든씨 2024. 8. 14.
  • 깃헙 알림으로 axios로 인한 보안 취약점이 발견됐다는 메시지가 왔음
    • SSRF에 대한 이슈였고, 해결책으로 axios의 1.7.4 버전 이상으로 업그레이드 하라고 함 
    • Affected versions :  axios(npm)   >= 1.3.2, <= 1.7.3
    • axios 1.7.2 allows SSRF via unexpected behavior where requests for path relative URLs get processed as protocol relative URLs.
    • 해당 이슈: https://github.com/axios/axios/issues/6545
  • 보안 공격으론 CSRF, XSS, SQL injection에 대해서만 알았어서 SSRF 는 처음 접하게 됨.
  • SSRF의 개념을 알아보고 위 이슈가 생긴 이유에 대해 파악하기 위해 글을 써봄

1. SSRF: Server-Side Request Forgery (서버 측 요청 위조) 

  • OWASP Top10 에 선정 된 웹 공격 기법
  • 서버가 위조된 요청을 보내도록 하는 공격 (CSRF는 Client측 위조) - CSRF와 주최가 바뀐 공격 
  • 공격자가 서버에게 악의적인 요청을 하게 하여, 서버가 의도하지 않은 내부 자원에 접근하도록 유도하는 취약점 
    • Client가 Server에 어떤 데이터(이미지와 같은)를 요청해서 Server가 DB에서 이미지 url을 가져온다고 할 때, 서버가 이미지가 아닌 경로를 틀어 password를 빼오게 하는... 
    • 공격자가 서버에 이미지 URL을 요청한다고 하면서도 실제로는 서버가 내부적으로 접근 가능한 민감한 정보를 노출할 수 있는 엔드포인트를 호출하도록 유도. 이러한 경우 서버는 의도치 않게 민감한 데이터(예: 비밀번호, 토큰, 기타 내부 자원)를 클라이언트에게 반환함
  • 같은 데이터를 요청하더라도 URL이 아닌 DMZ 영역 뒤에 있는 인스턴스의 IP, file scheme를 이용한 로컬 file의 경로등을 요청하여 SSRF를 수행할 수 있다. 

2.  aixos 에서는 어떤 문제가 있었나

 

Security Vulnerability: Server-Side Request Forgery (SSRF) in Axios - CVE-2024-39338 · Issue #6545 · axios/axios

Describe the bug Body: Hello Axios Team, I am reporting a high-severity security vulnerability related to Server-Side Request Forgery (SSRF) in Axios, identified as CVE-2024-39338. This vulnerabili...

github.com

  • 해당 이슈에 따르면 ' path-relative URLs are incorrectly processed as protocol-relative URLs ' 경로 상대URL이 프로토콜 상대 URL로 잘못 처리 된다는게 쟁점이었다. (=> 잠재적으로 SSRF 공격이 들어올 수 있는 )
    • 경로 상대 URL (Path-relative URL):
      • 현재 페이지의 경로를 기준으로 상대적인 위치
      • 예: "images/logo.png" 또는 "../about.html"
      b) 프로토콜 상대 URL (Protocol-relative URL):
      • 현재 페이지의 프로토콜(http 또는 https)을 그대로 사용하면서 다른 도메인이나 경로를 지정
      • 예: "//example.com/api/data"
  • 위의 경우를 예시로 들자면
    1. 현재 페이지 : https://example.com/app/
    2. 의도된 요청: "/api/data"라는 경로 상대 URL로 요청을 보내려고 함.
    3. 예상 결과: "https://example.com/api/data"로 요청이 가야 함.
    4. 실제 결과: "https://api/data"라는 완전히 다른 도메인으로 요청이 가버림.

 

 

참고