Command Execution Attack
Command Execution Attack이란?
해커가 서버에서 코드를 실행시키는 것이 가능하게 되는 순간, 그 사이트는 확실하게 망했다고 보아야 한다. 따라서 웹서버가 어떻게 상호작용할지 잘 설정하는 것이 중요하다.
자주 사용되는 해킹 방식이지만 고치기는 까다롭고 위험은 큰 유형…
리스크
Remote code execution
이 공격에 당하게 될 경우, 아주 위험한 보안 손실의 상황에 놓일 수 있다. 이 해킹이 실행된 시점에서 해커가 시스템의 모든 권한을 장악하기 위한 마지막 단계에 도달한 상태라고 보면 된다.
시스템을 완전히 장악당하면, 해커들은 이 서버를 botnet으로 사용할 가능성이 있다.
botnet - 정상적으로 서버를 구매하고 대여하여 이용하는 것 대신 타인의 서버를 장악하여 마음대로 사용할 목적의 net이다. 이런 식으로 여러개의 botnets을 통해 DoS 공격, 스팸 메일, 검색엔진 조작 등에 사용한다. 이러한 형식의 해킹은 여러곳에서 소스가 오기 때문에 블랙리스트 처리하기도 힘들다.
이런 문제들은 주로 오래된 코드들에서자주 발생한다
protection
어플리케이션이 특정 시스템을 수행할 때 커맨드스트링의 보안이 철저하게 설계되어있는지확인해야 한다.
커맨드 라인을 한꺼번에 불러오는 것을 지양한다.
현대 프로그래밍 언어는 당신의 파일들을 읽고 쓰고 메일을 보내고 다른 시스템을 동작시킬 수 있는 승인 인터페이스를 가지고 있다. 최대한 APIs를 쓰도록 한다. 정말 필수적인 상황에서만 쉘 커맨드를 허용하자.
영향을 받을만한 입력을 막자
;
&
`
만약 쉘 커맨드를 사용하게 된다면, 잠재적으로 위험한 영향을 끼칠 수 있는 문자들을 대비하도록 한다. 이러한 문자들은 숫자형 알파벳으로 변환시켜 사용하면 안전하다.
승인된 명령어 제안하기
최대한 모든 커맨드를 문자 비트열로 표현하자. 승인된 명령어들만 화이트리스트 하거나 특정 조건으로 열거한다.
코드 검토 수행
시스템의 취약점을 코드 리뷰 형식으로 파악한다. 팀 내에서 코드의 취약점을 파악해보도록 한다.
제한된 승인을 통한 수행
최소한의 제한된 승인을 통해 서버를 실행해보는 것 또한 좋은 연습이 된다. 웹서버를 꼭 필요한 디렉토리에만 엑세스 할 수 있도록 만들고 실행할 파일의 디렉토리를 최소화시킨다. Unix를 사용 중인 경우 chroot jail을 사용하여 악성 코드의 디렉토리 접근을 방지한다.
예제 코드
python-안전한 코드
from subprocess import call
# An invocation of the call(...) function will ensure only a single
# command is run.
call(["ls", "-l"])
python - 위험한 코드
from subprocess import call
# shell=True disables command injection checking.
call("cat " + filename, shell=True)
Node - 안전한 코드
child_process.execFile("/bin/ls", ["-l", input_path], function (err, result) {
console.log(result);
});
Node - 위험한 코드
var child_process = require("child_process");
child_process.exec("ls -l " + input_path, function (err, data) {
console.log(data);
});