Axios XSRF-TOKEN 취약성 업데이트

2023/11/08 일자로 Axios v0.8.1 ~ v1.5.1 버전에서 XSRF-TOKEN이 X-XSRF-TOKEN 헤더에 포함되어 매 요청마다 보내져 공격자에게 보여질 수 있는 CVE가 공개되었습니다. 대응 방법과 일어난 이유 XSRF-TOKEN 이 무엇인지 알아봅시다.
2023.11.17

개요

2023/11/08 일자로 Axios v0.8.1 ~ v1.5.1 버전에서 XSRF-TOKEN이 X-XSRF-TOKEN 헤더에 포함되어 매 요청마다 보내져 공격자에게 보여질 수 있는 CVE가 공개되었습니다.

https://nvd.nist.gov/vuln/detail/CVE-2023-45857

해당 CVE는 axios 에서 패치를 하여 v1.6.0 버전에 배포 되었습니다.

v1.6.0: https://github.com/axios/axios/releases/tag/v1.6.0

따라서, 위의 CVE 문제를 피하기 위해서는 v1.6.0 버전 이상으로 axios를 업데이트 해야합니다.

왜 생긴걸까?

패치 PR의 변경점을 살펴봅시다.

     // 기존 코드
     const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))
        && config.xsrfCookieName && cookies.read(config.xsrfCookieName);

      // 변경 후 코드
      // regarding CVE-2023-45857 config.withCredentials condition was removed temporarily
      const xsrfValue = isURLSameOrigin(fullPath) && config.xsrfCookieName && cookies.read(config.xsrfCookieName);

https://github.com/axios/axios/pull/6028

기존에는 withCredentials 을 옵션에 사용하고 있다면 헤더에 포함시키고 있던 것을 알 수 있습니다.

이 문제를 피하기 위해 withCredentials 을 체크하는 로직을 제거했습니다.

추가된 방법

기존에 withCredentials을 통해 자동으로 추가되던 것이 개발자가 숨겨진 사양을 알기 어려웠기에 v1.6.2 에서 withXSRFToken 이라는 옵션이 추가되었습니다.

https://github.com/axios/axios/releases/tag/v1.6.2

위의 CVE와 같은 결과가 되지만, 이 설정은 명시적으로 개발자에게 추가됨을 알리고 있게 됩니다.

따라서, 이와 같은 옵션이 필요하다면 v1.6.2으로 올려야 합니다.

XSRF-TOKEN 이 뭐길래

교차 사이트 요청 위조, Cross-Site Request Forgery, CSRF 혹은 XSRF 라 불리는 공격에 관련된 보안 토큰입니다.

공격자가 취약성이 있는 사이트에서 인증 cookie 를 받은 사용자를 공격용 사이트에서 취약성이 있는 사이트로 요청을 마음대로 할 수 있게 하는 공격입니다. 기존에 사용자가 가지고 있던 cookie가 자동으로 포함되게 되는 경우에 가능한 공격입니다.

이외의 자세한 설명은 아래의 링크를 참고해주세요.

https://learn.microsoft.com/ko-kr/aspnet/core/security/anti-request-forgery?view=aspnetcore-7.0

즉 위 처럼 문제가 생기는 경우는 인증에 cookie를 사용하고, 호스트는 다르지만 같은 도메인인 공유 호스팅 환경등에서 발생할 수 있습니다. 이와 같은 문제를 해결하기 위해 서버에서 XSRF-TOKEN 이라는 식별 가능한 토큰을 내려주게 되고, 사용자는 이 토큰을 포함해 요청하게 되어 보안을 강화할 수 있습니다.

위 내용을 통해 의도 하지 않게 XSRF-TOKEN 이 포함되어 요청이 되는 것이 왜 취약성인지 알 수 있습니다.

마무리

이러한 문제를 최대한 빠르게 대응 방법 및 내용에 대해 알기 위해서는 dependabot과 같은 취약성을 보고 해주는 툴들을 이용하고 있으면 좋습니다.

https://docs.github.com/ko/code-security/dependabot/dependabot-security-updates/configuring-dependabot-security-updates

필자도 dependabot의 알림을 받아 알게되었습니다 🫣