소프트웨어(SW) 보안약점 진단원/구현단계 보안약점 제거 기준
구현단계 보안약점 기준 - 오류상황 대응 부재
브루노W
2025. 6. 4. 22:30
유형 | 에러처리 |
보안약점 | 오류상황 대응 부재 |
개요 |
오류가 발생할 수 있는 부분을 확인하였으나, 이러한 오류에 대하여 예외 처리를 하지 않을 경우, 공격자는 오류 상황을 악용하여 개발자가 의도하지 않은 방향으로 프로그램이 동작하도록 할 수 있다.
|
보안대책 |
오류가 발생할 수 있는 부분에 대하여 제어문을 사용하여 적절하게 예외 처리(C/C++에서 if와 switch, Java에서 try-catch 등)를 한다.
|
진단방법 |
오류가 발생할 수 있는 부분에 대하여 예외처리를 수행했는지 확인하고 제어문으로 예외 처리하는 루틴이 비어있는지 확인한다.
|
연관된 설계단계 기준 | - |
코드예제
● 안전하지 않은 코드 예 (Java)
protected Element createContent(WebSession s) {
……
try {
username = s.getParser().getRawParameter(USERNAME);
password = s.getParser().getRawParameter(PASSWORD);
if (!"webgoat".equals(username) || !password.equals("webgoat")) {
s.setMessage("Invalid username and password entered.");
return (makeLogin(s));
}
} catch (NullPointerException e) {
// 요청 파라미터에 PASSWORD가 존재하지 않을 경우 Null Pointer Exception이 발생하고
// 해당 오류에 대한 대응이 존재하지 않아 인증이 된 것으로 처리
}
}
● 안전한 코드 예 (Java)
protected Element createContent(WebSession s) {
……
try {
username = s.getParser().getRawParameter(USERNAME);
password = s.getParser().getRawParameter(PASSWORD);
if (!"webgoat".equals(username) || !password.equals("webgoat")) {
s.setMessage("Invalid username and password entered.");
return (makeLogin(s));
}
} catch (NullPointerException e) {
// 예외 사항에 대해 적절한 조치를 수행하여야 한다.
s.setMessage(e.getMessage());
return (makeLogin(s));
}
}
● 안전하지 않은 코드 예 (C#)
try {
InvokeMtd();
} catch (CustomException e) {
// 예외 상황에 대한 대응 부재
}
● 안전한 코드 예 (C#)
try {
InvokeMtd();
} catch (CustomException e) {
// 예외 상황에 대해 적절한 조치를 수행하여야 한다.
logger.Debug("log message");
}
진단방법

오류가 발생할 수 있는 부분에 대하여 예외처리를 수행했는지 확인하고 제어문으로 예외 처리하는 루틴이 비어있는지 확인한다.
● 일반적인 진단의 예
…
private Connection conn;
public Connection DBConnect(String url, String id, String password) {
try {
String CONNECT_STRING = url + ":" + id + ":" + password;
InitialContext ctx = new InitialContext();
DataSource datasource = (DataSource) ctx.lookup(CONNECT_STRING);
conn = datasource.getConnection();
} catch (SQLException e) {
// catch 블록이 비어있음
} catch (NamingException e) {
// catch 블록이 비어있음
}
return conn;
}
try 블록에서 발생하는 오류를 포착(catch)하고 있지만 그 오류에 대해서 아무 조치를 하고 있지 않다. 따라서 프로그램이 계속 실행되기 때문에 프로그램에서 어떤 일이 일어났는지 전혀 알 수 없게 된다.