개요
Express는 웹 및 모바일 애플리케이션을 위한 강력한 기능 세트를 제공하는 최소한의 유연한 Node.js 웹 애플리케이션 프레임워크입니다.
Express 3 응답 개체 내에서 오픈 리디렉션 취약점(CVE-2024-9266)이 확인되었습니다.
OWASP에 따르면 URL 리디렉션이라고도 하는 오픈 리디렉션은 애플리케이션이 악의적일 수 있는 외부 URL로 연결되는 링크를 지정하는 사용자 제어 입력을 허용할 때 존재하는 입력 유효성 검사 결함입니다. 이러한 종류의 취약점은 피싱 공격을 수행하거나 피해자를 감염 페이지로 리디렉션하는 데 사용될 수 있습니다.
이는 3.4.5 이상 4.0.0 미만의 Express 버전에 영향을 미칩니다.
세부 정보
모듈 정보
- 제품: 제품: Express
- 영향을 받는 컴포넌트: express
- Affected versions: >=3.4.5 <4.0.0
- 깃허브 리포지토리: https://github.com/expressjs/express
- 게시된 패키지: https://www.npmjs.com/package/express
- 패키지 관리자: npm
취약점 정보
이 중간 심각도 취약점은 Express 패키지의 response.js에서 발견됩니다.
응답 객체에서 Express의 위치() 메서드가 오픈 리디렉션에 취약한 경우:
- 요청 경로는 이중 슬래시(//)로 시작됩니다
그리고 - 리디렉션을 위한 상대 경로는 ./로 시작하며 사용자가 제어하는 입력
과 - 위치 헤더는 해당 사용자 제어 입력으로 설정됩니다.
location() 메서드는 경로 //를 추출하고 ./를 평가하여 /로 반환하는 resolve( ) 메서드를 사용하여 상대 URL 앞에 추가하므로 위치 리디렉션의 결과 URL은 '///example.com'과 같은 것이 됩니다. 이는 대부분의 브라우저에서 유효한 체계 상대 특수 URL인 //example.com과 동등한 것으로 평가되며 헤더에 '위치' 로 전송됩니다: ///example.com' 으로 전송되며 사용자를 공격자의 사이트로 리디렉션할 수 있습니다.
재현 단계
- Express 애플리케이션 코드에서 URL 쿼리 매개변수를 통해 제공된 위치로 사용자를 리디렉션하는 경로를 만듭니다.
app.get('/', function (req, res) {
const pageId = req.query.pageId;
if (pageId && pageId[0] === '.') {
res.status(301).location(pageId);
}
res.send('OK');
});
- 브라우저에서 다음과 같은 쿼리를 사용하여 Express 애플리케이션 경로를 방문합니다:
http://localhost:3000//?pageId=./example.com
- 브라우저는 https://example.com 으로 리디렉션되어야 합니다. Chrome 개발자 도구로 브라우저의 헤더 세부 정보를 검사하여 결과를 확인할 수도 있습니다.
개념 증명
위와 유사한 코드가 포함된 전체 복제본은 여기에서 확인할 수 있습니다:
Express 3.x 오픈 리디렉션 복제본
크레딧
- 마베즈 마센코(파인더)
완화
Express 3는 수명이 종료되었으며 이 문제를 해결하기 위한 업데이트가 제공되지 않습니다.
영향을 받는 구성 요소의 사용자는 다음 완화 방법 중 하나를 적용해야 합니다:
- 최신 버전의 Express로 마이그레이션하세요.
- 히어로데브즈와 같은 상용 지원 파트너를 활용하여 EOL 이후 보안 지원을 받으세요.
저희가 지원하는 오픈 소스 소프트웨어에서 새로운 취약점이 수정될 때마다 알림을 받으세요.