
알려진 취약점이 있는 JavaScript 라이브러리의 사용을 감지하는 스캐너입니다. 또한 발견한 라이브러리의 SBOM을 생성할 수 있습니다.
필요한 것은 반드시 은퇴(retire)시켜야 한다
웹 및 Node.js 애플리케이션 모두에 사용할 수 있는 JavaScript 라이브러리 생태계는 매우 방대합니다. 이러한 라이브러리는 개발 속도를 크게 높여 주지만, 보안 취약점을 신속하게 처리하기 위해서는 지속적인 유지보수도 필요합니다. 2013년에는 '알려진 취약점이 있는 구성 요소 사용(Using Components with Known Vulnerabilities)'이 OWASP Top 10 주요 보안 위험 목록에 추가되면서, 오래되었거나 안전하지 않은 의존성이 웹 애플리케이션에 얼마나 심각한 위협이 될 수 있는지 강조되었습니다. Retire.js는 개발자가 알려진 취약점이 있는 JavaScript 라이브러리 버전, 특히 패키지 매니페스트에는 없지만 단순히 다운로드되어 소스 제어에 포함된 라이브러리를 식별하는 데 도움을 주기 위해 만들어졌습니다.
Retire.js는 여러 가지 방법으로 사용할 수 있습니다:
웹 앱 또는 Node 앱에서 취약한 JavaScript 라이브러리 및/또는 Node.js 모듈 사용 여부를 스캔합니다. 아직 설치하지 않았다면 먼저 node/npm을 설치해야 합니다. 애플리케이션 폴더의 소스 코드 폴더에서 다음을 실행하세요:
$ npm install -g retire
$ retire
retire.js는 CycloneDX 형식으로 SBOM을 생성할 수 있습니다:
$ retire --outputformat cyclonedx
cyclonedx는 CycloneDX 1.4 XML을 생성합니다. JSON 및 최신 사양 버전을 원한다면 cyclonedxJSON(1.4), cyclonedxJSON1_6 또는
cyclonedxJSON1_7을 사용하세요. cyclonedxJSON1_6_VEX 및 cyclonedxJSON1_7_VEX 변형에는 vulnerabilities 섹션도 포함됩니다.
기본적으로 retire.js는 취약점을 발견하면 종료 코드 13으로 종료합니다. 이는 --exitwith 0으로 재정의할 수 있습니다.
방문한 사이트에서 안전하지 않은 라이브러리에 대한 참조를 스캔하고 개발자 콘솔에 경고를 표시합니다. 주소 표시줄의 아이콘은 취약한 라이브러리가 로드되었는지 여부도 표시합니다.
@h3xstream은 침투 테스트 도구인 Burp 및 OWASP ZAP용 플러그인으로 Retire.js를 적용했습니다.
OWASP ZAP 팀은 Retire.js 애드온을 공식적으로 지원합니다. 이 애드온은 ZAP 마켓플레이스에서 제공되며 ZAP 주간 릴리스에 기본적으로 포함됩니다: https://www.zaproxy.org/docs/desktop/addons/retire.js/
retire-site-scanner https://github.com/RetireJS/retire-site-scanner는 Chrome/Firefox 확장 프로그램을 사용하는 대신 헤드리스 모드로 웹 사이트를 스캔하는 데 사용할 수 있습니다.
애플리케이션의 빌드 루틴이나 다른 자동화된 워크플로의 일부로 Retire.js를 실행하기 위한 Grunt 작업입니다.
gulpfile에서 프로젝트 파일을 자동으로 감시하고 스캔하는 데 사용할 수 있는 Gulp 작업 예제입니다. 감시 패턴과 (선택 사항) Retire.js 옵션은 원하는 대로 수정할 수 있습니다.
const c = require("ansi-colors");
var gulp = require("gulp");
var beeper = require("beeper");
var log = require("fancy-log");
var spawn = require("child_process").spawn;
gulp.task("retire:watch", ["retire"], function (done) {
// Watch all javascript files and package.json
gulp.watch(["js/**/*.js", "package.json"], ["retire"]);
});
gulp.task("retire", function () {
// Spawn Retire.js as a child process
// You can optionally add option parameters to the second argument (array)
var child = spawn("retire", [], { cwd: process.cwd() });
child.stdout.setEncoding("utf8");
child.stdout.on("data", function (data) {
log(data);
});
child.stderr.setEncoding("utf8");
child.stderr.on("data", function (data) {
log(c.red(data));
beeper();
});
});
기부금은 이 도구와 취약점 저장소의 유지보수 자금으로 사용됩니다.