>웹 프론트엔드 >JS 튜토리얼 >Node.js에서 시스템 명령을 안전하게 호출하는 방법(보안 취약점 주입을 방지하기 위해)

Node.js에서 시스템 명령을 안전하게 호출하는 방법(보안 취약점 주입을 방지하기 위해)

PHPz
PHPz원래의
2016-05-16 16:29:071611검색

이 글에서는 (보안 취약점 주입을 피하기 위해) 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)
});
spawn 또는 execfile을 사용할 때 목표는 하나의 명령(매개변수)만 실행하는 것입니다. 이는 /bin/ls가 백틱 또는 파이프를 처리하는 방법을 모르기 때문에 사용자가 삽입된 명령을 실행할 수 없음을 의미합니다. /bin/bash가 수행하는 작업은 해당 명령의 매개변수를 해석하는 것입니다. 익숙하다면

을 사용하는 것과 비슷하지만 주의할 점은 다음과 같습니다. 예를 들어, generate 또는 execFile을 사용하는 것이 항상 안전하지는 않습니다. /bin/find를 실행하고 사용자 입력 매개변수를 전달하면 시스템이 손상될 수 있습니다. find 명령에는 임의 파일을 읽고 쓸 수 있는 몇 가지 옵션이 있습니다. 🎜>여기에는 Node.js에서 시스템 명령을 실행하기 위한 몇 가지 지침이 있습니다. :
[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]

child_process.exec를 사용하지 마세요. 특히 사용자가 입력한 매개변수를 포함해야 하는 경우에는 사용자에게 입력을 요청하는 것보다 옵션을 사용하여 사용자가 매개변수를 전달하도록 하는 것이 훨씬 좋습니다. 문자열을 직접 입력 사용자가 매개변수를 입력하도록 허용해야 하는 경우 명령의 매개변수를 광범위하게 참조하여 어떤 옵션이 안전한지 확인하고 화이트리스트를 설정하세요.

위 내용은 이 내용의 전체 내용입니다. 더 많은 관련 튜토리얼을 보려면

Node.js 동영상 튜토리얼

을 방문하세요!
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.