소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.
SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.
해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.
제 4절 에러처리
오류가 발생할 수 있는 부분을 확인하였으나, 이러한 오류에 대하여 예외 처리를 하지 않을 경우, 공 격자는 오류 상황을 악용하여 개발자가 의도하지 않은 방향으로 프로그램이 동작하도록 할 수 있다.
1. 적절한 인증 없는 중요기능 허용
가. 개요
적절한 인증과정이 없이 중요정보(계좌이체 정보, 개인정보 등)를 열람(또는 변경)할 때 발생하는 보안약점이다
나. 보안대책
오류가 발생할 수 있는 부분에 대하여 제어문을 사용하여 적절하게 예외 처리(C/C++에서 if와 switch, Java에서 try-catch 등)를 한다.
다. 코드예제
다음 예제는 try 블록에서 발생하는 오류를 포착(catch)하고 있지만, 그 오류에 대해서 아무 조치를 하고 있지 않음을 보여준다. 아무 조치가 없으므로 프로그램이 계속 실행되기 때문에 프로그램에서 어떤 일이 일어났는지 전혀 알 수 없게 된다.
- 안전하지 않은 코드의 예 JAVA -
1: protected Element createContent(WebSession s) {
2: ……
3: try {
4: username = s.getParser().getRawParameter(USERNAME);
5: password = s.getParser().getRawParameter(PASSWORD);
6: if (!"webgoat".equals(username) || !password.equals("webgoat")) {
7: s.setMessage("Invalid username and password entered.");
8: return (makeLogin(s));
9: }
10: } catch (NullPointerException e) {
//요청 파라미터에 PASSWORD가 존재하지 않을 경우 Null Pointer Exception이 발생하고 해당
오류에 대한 대응이 존재하지 않아 인증이 된 것으로 처리
11: }
- 안전한 코드의 예 JAVA -
예외를 포착(catch)한 후, 각각의 예외 사항(Exception)에 대하여 적절하게 처리해야 한다.
1: protected Element createContent(WebSession s) {
2: ……
3: try {
4: username = s.getParser().getRawParameter(USERNAME);
5: password = s.getParser().getRawParameter(PASSWORD);
6: if (!"webgoat".equals(username) || !password.equals("webgoat")) {
7: s.setMessage("Invalid username and password entered.");
8: return (makeLogin(s));
9: }
10: } catch (NullPointerException e) {
//예외 사항에 대해 적절한 조치를 수행하여야 한다.
11: s.setMessage(e.getMessage());
12: return (makeLogin(s));
13: }
라. 진단방법
오류가 발생할 수 있는 부분에 대하여 예외처리를 수행했는지 확인하고 제어문을 통하여 예외 처리 하는 루틴이 비어있는지 확인한다.
다음의 예제는 try 블록에서 발생하는 오류를 포착(catch)하고 있지만 그 오류에 대해서 아무 조치를 하고 있지 않다. 따라서 프로그램이 계속 실행되기 때문에 프로그램에서 어떤 일이 일어났는지 전혀 알 수 없게 된다.
1: …
2: private Connection conn;
3:
4: public Connection DBConnect(String url, String id, String password) {
5: try {
6: String CONNECT_STRING = url + “:” + id + “:” + password;
7: InitialContext ctx = new InitialContext();
8: DataSource datasource = (DataSource) ctx.lookup(CONNECT_STRING);
9: conn = datasource.getConnection();
10: } catch (SQLException e) {
11: // catch 블록이 비어있음
12: } catch (NamingException e) {
13: // catch 블록이 비어있음
14: }
15: return conn;
16: }
'보안 공부 > 소스코드 보안약점 진단' 카테고리의 다른 글
소스코드 보안약점 진단 - Null Pointer 역참조 (0) | 2022.01.31 |
---|---|
소스코드 보안약점 진단 - 부적절한 예외 처리 (0) | 2022.01.28 |
소스코드 보안약점 진단 - 오류 메시지를 통한 정보노출 (0) | 2022.01.26 |
소스코드 보안약점 진단 - 종료되지 않는 반복문 또는 재귀함수 (0) | 2022.01.25 |
소스코드 보안약점 진단 - 경쟁조건: 검사 시점과 사용 시점(TOCTOU) (0) | 2022.01.24 |