입력 데이터 검증 및 표현 - 경로 조작 및 자원 삽입
[개념]
시스템 자원 접근경로 또는 자원제어 명령어에 검증되지 않은 외부 입력값을 허용하여 시스템 자원에 무단 접근 및 악의적인 행위가 가능한 보안약점
[공격 사례]
- 경로조작 및 자원삽입
- 입력값을 조작하여 허가되지 않은 명령 실행
[설계 시 고려사항]
1. 외부입력값을 이용하여 시스템자원(IP, PORT번호, 프로세스, 메모리, 파일 등)을 식별하는 경우 허가되지 않은 자원이 사용되지 않도록 해야 한다.
2. 서버프로그램 안에서 셸을 생성하여 명령어를 실행해야 하는 경우 외부입력값에 의해 악의적인 명령어가 실행되지 않도록 해야 한다.
[보안대책]
외부의 입력을 자원(파일, 소켓의 포트 등)의 식별자로 사용하는 경우, 적절한 검증을 거치도록 하거나, 사전에 정의된 적합한 리스트에서 선택되도록 한다. 특히, 외부의 입력이 파일명인 경우에는 경로순회(directory traversal) 공격의 위험이 있는 문자(" / \ .. 등)를 제거할 수 있는 필터를 이용한다.
[안전하지 않은 코드의 예 JAVA]
//외부로부터 입력받은 값을 검증 없이 사용할 경우 안전하지 않다.
String fileName = request.getParameter("P");
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
FileInputStream fis=null;
try{
response.setHeader("Content-Disposition","attachment;filename="+fileName+";");
.
.
.
//외부로부터 입력받은 값이 검증 또는 처리 없이 파일처리에 수행되었다.
fis=new FileInputStream("C:/datas/"+fileName);
bis=new BufferedInputStream(fis);
bos=new BufferedOutputStream(response.getOutputStream());
> 외부 입력값(P)이 버퍼로 내용을 옮길 파일의 경로설정에 사용되고 있다. 만일 공격자에 의해 P의 값으로 ../../../rootFile.txt와 같은 값을 전달하면 의도하지 않았던 파일의 내용이 버퍼에 쓰여 시스템에 악영향을 준다.
[안전한 코드의 예 JAVA]
String fileName = request.getParameter("P");
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
FileInputStream fis=null;
try{
response.setHeader("Content-Disposition","attachment;filename="+fileName+";");
.
.
.
//외부로부터 입력받은 값으르 경로순회 문자열(../\)을 제거하고 사용해야한다.
filename=filename.replaceAll("\\.","").replaceAll("/","").replaceAll("\\\\","");
fis=new FileInputStream("C:/datas/"+fileName);
bis=new BufferedInputStream(fis);
bos=new BufferedOutputStream(response.getOutputStream());
int read;
while((read=bis.read(buffer,0,1024))!=-1){
bos.write(buffer,0,read);
}
> 외부 입력값에 대해 상대경로를 설정할 수 없도록 경로순회 문자열(/ \ & .. 등)을 제거하고 파일의 경로설정에 사용한다.
[참고]
- 소프트웨어 개발보안 가이드
- 소프트웨어 보안약점 진단가이드
'보안 > 시큐어코딩' 카테고리의 다른 글
[시큐어코딩] 부적절한 자원 해제_개념 및 해결방법 (0) | 2024.02.04 |
---|---|
[시큐어코딩] 적절하지 않은 난수값 사용, random() 취약점 (0) | 2023.11.04 |