https://www.kisa.or.kr/public/laws/laws3.jsp
구현 단계 시큐어코딩 가이드 - 입력 데이터 검증 및 표현 - 경로 조작 및 자원 삽입
가. 개요
- 검증되지 않은 외부 입력값을 통해 파일 및 서버 등 시스템 자원에 대한 접근 혹은 식별을 허용할 경우, 입력값 조작을 통해 시스템이 보호하는 자원에 임의로 접근할 수 있는 보안약점이다.
- 경로 조작 및 자원 삽입 약점을 이용하여 공격자는 자원의 수정․삭제, 시스템 정보 누출, 시스템 자원 간 충돌로 인한 서비스 장애 등을 유발할 수 있다. 즉, 경로 조작 및 자원 삽입을 통해서 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경하거나 실행시킬 수 있다.
나. 보안대책
- 외부의 입력을 자원(파일, 소켓의 포트 등)의 식별자로 사용하는 경우, 적절한 검증을 거치도록 하거나, 사전에 정의된 적합한 리스트에서 선택되도록 한다.
- 특히, 외부의 입력이 파일명인 경우에는 경로순회(directory traversal)공격의 위험이 있는 문자( “ / ₩ .. 등 )를 제거할 수 있는 필터를 이용한다. 1
다. 코드예제
JAVA
외부 입력값(P)이 버퍼로 내용을 옮길 파일의 경로 설정에 사용되고 있다. 만일 공격자에 의해 P의 값으로 ../../../rootFile.txt와 같은 값을 전달하면 의도하지 않았던 파일의 내용이 버퍼에 쓰여 시스템에 악영향을 준다.
외부 입력값에 대하여 상대 경로를 설정할 수 없도록 경로 순회 문자열( / ₩ & .. 등 )을 제거하고 파일의 경로 설정에 사용한다.
인자 값이 파일 이름인 경우에는 애플리케이션에서 정의(제한)한 디렉터리 c:₩help_files₩에서 파일을 읽어서 출력하지만, args[0]의 값으로 "..₩..₩..₩windows₩system32₩drivers₩etc₩hosts"와 같이 경로 조작 문자열을 포함한 입력이 들어오는 경우 접근이 제한된 경로의 파일을 열람할 수 있다.
외부 입력값으로 파일 경로를 조합하여 파일 시스템에 접근하는 경로를 만들지 말아야 한다. 외부에서 입력되는 값에 대하여 null 여부를 체크하고, 외부에서 입력되는 파일 이름에서 경로 조작 문자열 제거 조치 후 사용하도록 한다
C#
다음 C# 코드는 외부 입력값을 파일명에 바로 사용하고 있다. 이는 의도치 않은 파일의 손상을 가져올 수 있다.
외부 입력값에 경로 조작 문자열을 제거하여 조작 위험을 없앨 수 있다.
C
아래 C 코드는 외부 입력 값을 파일 경로로 바로 사용하고 있다. 이는 공격자가 환경 변수 reportfile 을 조작하여 디렉터리 경로를 조작할 수 있다.
아래 C 코드는 외부에서 불러온 파일 이름을 그대로 사용하지 않고 경로 조작 가능성이 있는 문자열을 검증하고 사용한다.
참고자료
- CWE-99 Resource Injection, MITRE,
http://cwe.mitre.org/data/definitions/99.html - CWE-22 Path Traversal, MITRE,
http://cwe.mitre.org/data/definitions/22.html - Path Traversal, OWASP,
https://www.owasp.org/index.php/Path_Traversal
- 경로순회 : “./”,“../” 등을 사용하여 상대 경로 참조 방식을 이용해 웹 루트 디렉터리를 벗어나 다른 디렉터리의 중요 파일에 접근하는 공격법. 경로 추적이라고도 함 [본문으로]
'공부 > KISA' 카테고리의 다른 글
운영체제 명령어 삽입 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.18 |
---|---|
크로스사이트 스크립트 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.18 |
SQL 삽입 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.17 |
세션통제 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.17 |
예외처리 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.17 |
댓글