개요
Vue는 세분화된 반응성을 갖춘 웹 애플리케이션을 개발하기 위한 HTML, CSS 및 JS 프레임워크입니다.
Vue 2 컴파일러에서 리도스 취약점(CVE-2024-9506)이 발견되었습니다.
OWASP에 따르면 정규식 서비스 거부(ReDoS)는 대부분의 정규식 구현이 입력 크기에 따라 매우 느리게 작동하는 극단적인 상황에 도달할 수 있다는 점을 악용하는 서비스 거부 공격입니다. 공격자는 정규식(Regex)을 사용하는 프로그램을 이러한 극단적인 상황에 처하게 한 다음 매우 오랜 시간 동안 멈추게 할 수 있습니다.
세부 정보
모듈 정보
- 제품: 제품: Vue
- 영향을 받는 패키지: 컴파일러-sfc, 서버-렌더러, 템플릿-컴파일러
- Affected versions: >=2.0.0 <3.0.0
- 깃허브 리포지토리: https://github.com/vuejs/vue
- 게시된 패키지: https://www.npmjs.com/package/vue
- 패키지 관리자: npm
취약점 정보
이 심각도가 낮은 취약점은 여러 Vue 패키지 내의 html-parser.ts 파일에서 발견됩니다:
- 컴파일러-sfc
- 서버-렌더러
- 템플릿 컴파일러
- 뷰 템플릿 컴파일러
- 뷰-서버-렌더러
html-parser.ts에 있는 Vue의 parseHTML() 함수는 다음과 같은 경우 리도스 공격에 취약합니다:
- The template string contains a <script>, <style>, or <textarea> without a matching closing tag
Within the parseHTML() function there is a regular expression (regex) to check for proper closing tags for the three tags listed above. However, due to an improperly written regex, when you pass in something like <script>some very very long text</not-script> it will trigger a ReDoS.
재현 단계
Within Vue 2 client-side application code, create a new Vue instance with a template string that includes a <script> node tag that has a different closing tag (in this case </textarea>).
new Vue({
el: '#app',
template: '
<div>
Hello, world!
<script>${'<'.repeat(1000000)}</textarea>
</div>'
});
- 위의 JavaScript를 로드하는 index.html 파일을 설정한 다음 마운트()를 사용하여 새로 생성된 Vue 인스턴스를 마운트합니다.
<!DOCTYPE html>
<html>
<head>
<title>My first Vue app</title>
</head>
<body>
<div id="app">
Loading..
</div>
</body>
</html>
- 브라우저에서 Vue 애플리케이션을 방문합니다.
http://localhost:3000
- 브라우저에서 ReDoS 취약점이 페이지가 템플릿을 구문 분석하고 Vue 애플리케이션을 마운트하는 데 걸리는 시간을 어떻게 증가시킬 수 있는지 관찰합니다. 이것은 ReDoS 취약점을 보여줍니다.
개념 증명
위와 유사한 코드가 포함된 전체 복제본은 여기에서 확인할 수 있습니다:
Vue2 HTML 태그 불일치 ReDoS
↪cf_200D↩크레딧
- K(파인더)
완화
Vue 2는 수명이 종료되었으며 이 문제를 해결하기 위한 업데이트가 제공되지 않습니다.
영향을 받는 구성 요소의 사용자는 다음 완화 방법 중 하나를 적용해야 합니다:
- 최신 버전의 Vue로 마이그레이션합니다.
- 히어로데브즈와 같은 상용 지원 파트너를 활용하여 EOL 이후 보안 지원을 받으세요.
저희가 지원하는 오픈 소스 소프트웨어에서 새로운 취약점이 수정될 때마다 알림을 받으세요.