1. 정의
절대 디렉토리 경로 조작 (Absolute Path Traversal)
외부 입력이 파일 시스템을 조작하는 경로를 직접 제어할 수 있거나 영향을 끼치면 위험하다. 사용자 입력이 파일 시스템 작업에 사용되는 경로를 제어하는 것을 어용하면, 공격자가 응용프로그램에 치명적인 시스템 파일 또는 일반 파일을 접근하거나 변경할 가능성이 존재한다. 즉, 경로 조작을 통해서 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경할 수 있거나 실행시킬 수 있다.
2. 해결방법
- 외부의 입력을 통해 파일이름의 생성 및 접근을 허용하지 말고, 외부 입력에 따라 접근이 허용된 파일의 리스트에서 선택하도록 프로그램을 작성하는 것이 바람직하다.
3. 예제
========================== 안전하지 않은 코드의 예 ==========================
String userId = request.getParameter(USER_ID_PARAM);
String styleFileName = request.getParameter(STYLE_FILE_NAME_PARAM);
String userHomePath = getUserHomeDir(userId);
byte [] buffer = new byte [BUFFER_SIZE];
FileInputStream inputStream = new FileInputStream(userHomePath + styleFileName);
inputStream.read(buffer);
============================================================================
위의 예제에서는 외부의 입력(userId)으로 부터 직접 파일을 생성하게 되는 경우 임의의 파일이름을 입력 받을 수 있도록 되어 있어, 다른 파일에 접근이 가능하거나 의도하지 않은 공격에 노출될 수 있다.
============================== 안전한 코드의 예 =============================
private Hashtable<String, String> styleFileNames;
public DocumentService()
{
styleFileNames = new Hashtable<String, String>();
styleFileNames.put("Normal", "NormalStyle.cfg");
styleFileNames.put("Classic", "ClassicStyle_1.cfg");
styleFileNames.put("Gothic", "ClassicStyle_2.cfg");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String command = request.getParameter("command");
if (command.equals(APPLY_STYPLE_COMMAND))
{
String userId = request.getParameter(USER_ID_PARAM);
String styleName = request.getParameter(STYLE_NAME_PARAM);
String userHomePath = getUserHomeDir(userId);
String styleFilePath = userHomePath + styleFileNames.get(styleName);
byte [] buffer = new byte [BUFFER_SIZE];
FileInputStream inputStream = new FileInputStream(styleFilePath);
inputStream.read(buffer);
}
}
============================================================================
위의 코드에서는 외부의 입력(userId)으로 부터 값을 받은 후 먼저 그것을 이미 정해진 styleFileNames와 매칭시켜 실제적인 파일명으로 만들었다. 그 후 경로값과 합쳐 완전한 파일 경로로 만든 후 파일을 생성하고 있다. 이렇게 값을 미리 정해놓은 값으로 만들어 사용하여 직접적인 외부 입력값 사용을 피하면 의도하지 않은 공격을 사전에 방지할 수 있다.
'04. 시큐어코딩' 카테고리의 다른 글
시큐어코딩(14) - Integer Overflow or Wraparound (0) | 2017.11.17 |
---|---|
시큐어코딩(13) - HTTP Response Splitting (0) | 2017.11.17 |
시큐어코딩(11) - Relative Path Traversal (1) | 2017.11.17 |
시큐어코딩(10) - Cross-Site Request Forgery (0) | 2017.11.17 |
시큐어코딩(9) - LDAP Injection (0) | 2017.11.16 |