이 글에서는 (보안 취약점 주입을 피하기 위해) Node.js에서 시스템 명령을 안전하게 호출하는 방법을 주로 소개합니다. 이 장에서는 문자열을 연결할 때 발생할 수 있는 보안 문제에 대해 전반적으로 설명합니다.
이 기사에서는 Node.js를 올바르게 사용하여 일반적인 명령줄 삽입 취약점을 방지하기 위해 시스템 명령을 호출하는 방법을 알아봅니다.
명령 호출에 자주 사용하는 방법은 가장 간단한 child_process.exec입니다. 문자열 명령을 전달하고 오류 또는 명령 처리 결과를 콜백 함수에 다시 전달하는 매우 간단한 사용 패턴을 가지고 있습니다.
child_process.exec를 통해 시스템 명령을 호출하는 매우 일반적인 예는 다음과 같습니다.
child_process.exec('ls', function (err, data) { console.log(data); });
그런데 호출하는 명령에 사용자가 입력한 매개변수를 추가해야 하는 경우에는 어떻게 되나요? 확실한 해결책은 사용자 입력을 명령과 직접 문자열 병합하는 것입니다. 그러나 내 수년간의 경험에 따르면 한 시스템에서 다른 시스템으로 연결된 문자열을 보낼 때 언젠가는 문제가 발생할 수 있습니다.
var path = "user input"; child_process.exec('ls -l ' + path, function (err, data) { console.log(data); });
연결 문자열에 문제가 있는 이유는 무엇인가요?
글쎄, child_process.exec 엔진 아래에서는 "/bin/sh"가 호출되어 실행되기 때문입니다. 대상 프로그램보다는 전송된 명령은 쉘을 실행하기 위해 단순히 새로운 '/bin/sh' 프로세스로 전달됩니다. child_process.exec라는 이름은 다소 오해의 소지가 있습니다. 이것은 프로그램을 시작하는 것이 아니라 bash 해석기입니다. 사용자가 입력한 매개변수를 직접 실행하면 치명적인 결과가 발생합니다.
[pid 25170] execve("/bin/sh", ["/bin/sh", "-c", "ls -l user input"], [/* 16 vars */]
예를 들어 공격자는 세미콜론 ";"을 사용하여 명령을 종료하고 새 명령을 시작할 수 있으며 백틱이나 $를 사용할 수 있습니다. ()를 사용하여 하위 명령을 실행합니다.
그러면 execFile/spawn을 호출하는 올바른 방법은 무엇인가요 🎜>
spawn 및 execFile과 마찬가지로 추가 배열 매개변수를 취합니다. 쉘 환경에서 다른 명령을 실행하고 추가 명령을 실행하지 않습니다. execFile을 사용하여 이전 예제를 generate로 수정하여 시스템 호출이 어떻게 다른지, 왜 명령 주입에 취약하지 않은지 살펴보겠습니다. 시스템 호출
child_process.spawn
은 실행 중인
시스템 호출의 생성 대체를 사용하는 예제와 매우 유사합니다. 🎜>var child_process = require('child_process'); var path = "." child_process.execFile('/bin/ls', ['-l', path], function (err, result) { console.log(result) });
[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]
child_process.exec를 사용하지 마세요. 특히 사용자가 입력한 매개변수를 포함해야 하는 경우에는 사용자에게 입력을 요청하는 것보다 옵션을 사용하여 사용자가 매개변수를 전달하도록 하는 것이 훨씬 좋습니다. 문자열을 직접 입력 사용자가 매개변수를 입력하도록 허용해야 하는 경우 명령의 매개변수를 광범위하게 참조하여 어떤 옵션이 안전한지 확인하고 화이트리스트를 설정하세요.
위 내용은 이 내용의 전체 내용입니다. 더 많은 관련 튜토리얼을 보려면Node.js 동영상 튜토리얼
을 방문하세요!