Secure Coding Guide | 운영체제 명령어 삽입

정의

검증되지 않은 외부 입력값이 운영체제 명령문 생성에 사용되어 악의적인 명령어가 실행될 수 있는 보안 약점이다.

영향

공격자는 공격용 툴을 외부로부터 업로드하거나, 업로드된 툴에 대해 실행권한을 부여할 수 있으며, 관리자 권한을 획득하여 서버 제어 가능하게 된다.

조치 방법

외부에서 전달되는 값이 바로 시스템 내부 명령어에 사용되는 경우

안전하지 않은 Java 코드 일부

Set<String> filterSet = new HashSet<String>();
filterSet.add("del");
filterSet.add("rmdir");
String year = request.getParameter("year");
for (String filter : filterSet) {
    year = year.replace(filter, "##" + filter.trim() + "## ");
}
File exeFile = new File(...);
FileUtil.write(exeFile, file.getAbsolutePath() + " " + year);
Process process = Runtime.getRuntime().exec(exeFile.getPath(), null, file.getParentFile());

dir에 대한 필터셋이 존재하지 않아, 디렉터리에 대한 정보가 노출 될 수 있는 위험이 존재한다.

안전한 Java 코드 일부

// dir에 대한 필터셋을 추가하는 방법
filterSet.add("dir ");

// 정규식을 사용하는 방법
String year = request.getParameter("year");
if(year != null && year.matches("[0-9]{4}")) {
    File exeFile = new File(...);
    FileUtil.write(exeFile, file.getAbsolutePath() + " " + year);
    Process process = Runtime.getRuntime().exec(exeFile.getPath(), null, file.getParentFile());
}

year에 대한 값(예를 들어, 2015)만 입력 받을 수 있도록 정규 식을 사용하여 소스코드를 변경해야 한다.