티스토리 뷰

 

1. 개요

프로세스가 외부 입력 값을 코드(명령어)로 해석·실행할 수 있고 프로세스에 검증되지 않은 외부 입력 값을 허용한 경우 공격자에 의해 악의적인 코드가 실행 가능한 보안약점

 

2. 보안대책

 

- 취약한 함수 사용 지양: 동적코드를 실행할 수 있는 함수를 사용하지 않는다.
- 화이트리스트: 실행 가능한 동적코드를 입력 값으로 받지 않도록, 외부 입력 값에 대하여 화이트리스트 방식으로 구현한다.

- 유효성 검사: 유효한 문자만 포함하도록 동적 코드에 사용되는 사용자 입력 값을 필터링한다.

 

3. 코드예제

※ 아래 예제들은 KISA의 소프트웨어 개발보안 가이드, SW 보안약점 진단가이드의 예제를 옮겨놓았습니다.

 

[안전하지 않은 코드 - JAVA]

//취약예시1
public class CodeInjectionController {
@RequestMapping(value = "/execute", method = RequestMethod.GET)
public String execute(@RequestParam("src") String src)
throws ScriptException {
ScriptEngineManager scriptEngineManager = new
ScriptEngineManager();
ScriptEngine scriptEngine =
scriptEngineManager.getEngineByName("javascript");
// 외부 입력값인 src를 javascript eval 함수로 실행하고 있어 안전하지 않다.
String retValue = (String)scriptEngine.eval(src);
return retValue;
}}

//취약예시2
<body>
<%
String name = request.getparameter("name");
%>
...
<script>
// 외부 입력값인 name을 javascript new Function()을 이용하여 문자열을 함수로 실행하고 있다.
(new Function(<%=name%>))();
</script>
</body>

 

[안전한 코드 - JAVA]

- 정규식을 이용하여 특수문자에 대한 유효성 체크 로직을 추가하거나, if 문을 활용하여 화이트리스트 방식으로 검증

//안전한 코드 1.
@RequestMapping(value = "/execute", method = RequestMethod.GET)
public String execute(@RequestParam("src") String src) throws ScriptException {
// 정규식을 이용하여 특수문자 입력시 예외를 발생시킨다.
if (src.matches("[ \ \w]*") == false) {
throw new IllegalArgumentException();
}
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
String retValue = (String)scriptEngine.eval(src);
return retValue;
}

//안전한 코드 2.
@RequestMapping(value = "/execute", method = RequestMethod.GET)
public String execute(@RequestParam("src") String src) throws ScriptException {
// 유효한 문자 “_” 일 경우 실행할 메소드 호출한다.
if (src.matches("UNDER_BAR“) == true) {
...
// 유효한 문자 “$” 일 경우 실행할 메소드 호출한다.
} else if (src.matches("DOLLAR“) == true) {
...
// 유효하지 않은 특수문자 입력시 예외를 발생시킨다.
} else {
throw new IllegalArgumentException();
}...}