소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.
SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.
해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.
제2절 보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현시 발생할 수 있는 보안 약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
6. 중요정보 평문전송
가. 개요
사용자 또는 시스템의 중요정보가 포함된 데이터를 평문으로 송·수신할 경우, 통신채널 스니핑을 통해 인가되지 않은 사용자에게 민감한 데이터가 노출될 수 있는 보안약점이다.
나. 보안대책
민감한 정보를 통신 채널을 통하여 내보낼 때에는 반드시 암호화 과정을 거쳐야 하며, 필요할 경우 SSL 또는 HTTPS 등과 같은 보안 채널을 사용해야 한다. HTTPS와 같은 보안 채널을 사용하거나, 브 라우저 쿠키에 중요 데이터를 저장하는 경우, 쿠키객체에 보안속성을 설정하여 (Ex. setSecure (true) 메서드 사용 등) 중요정보노출을 방지한다. 보안속성이 설정된 쿠키는 HTTP로는 전송되지 않으므로, 중요 데이터를 저장한 쿠키를 HTTP로 전송하기 위해서는 보안 속성이 설정 되어서는 안되며 대신 반드시 암호화를 적용하여야 한다.
다. 코드예제
아래 예제는 패스워드를 암호화하지 않고 네트워크를 통해 전송하고 있다. 이 경우 패킷 스니핑을 통하여 패스워드가 노출될 수 있다.
- 안전하지 않은 코드의 예 JAVA -
1: try {
2: Socket s = new Socket("taranis", 4444);
3: PrintWriter o = new PrintWriter(s.getOutputStream(), true);
//패스워드를 평문으로 전송하여 안전하지 않다.
4: String password = getPassword();
5: o.write(password);
6: } catch (FileNotFoundException e) {
7: ……
- 안전한 코드의 예 JAVA -
아래 예제는 패스워드를 네트워크를 통해 서버로 전송하기 전에 AES 등의 안전한 암호알고리즘으로 암호화한 안전한 프로그램이다.
// 패스워드를 암호화 하여 전송
1: try {
2: Socket s = new Socket("taranis", 4444);
3: PrintStream o = new PrintStream(s.getOutputStream(), true);
//패스워드를 강력한 AES암호화 알고리즘을 통해 전송하여 사용한다.
4: Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
5: String password = getPassword();
6: byte[] encPassword = c.update(password.getBytes());
7: o.write(encPassword, 0, encPassword.length);
8: } catch (FileNotFoundException e) {
9: ……
라. 진단방법
해당 보안약점은 보안특정 중 평문전송과 관련된 내용으로 정적도구를 사용하여 중요정보의 기준을 판단하는 것은 어렵다.
개인정보(주민등록번호, 여권번호 등), 금융정보(카드·계좌번호), 패스워드 등 민감한 정보를 다루 는지 확인하고, 해당 정보가 네트워크 등을 통하여 전송될 때 암호화 여부를 확인하고, 보안 채널을 이용하도록 한다. 민감한 정보가 있는 URL을 전송할 경우에도 마찬가지로 암호화 작업을 수행 하도록 한다. 또한 중요정보를 쿠키에 저장하여 전송할 경우 암호화를 통해서 전송해야 하며, 특히 setSecure(true)와 같은 함수를 이용하여 암호화를 해야 한다. 이러한 절차가 생략되어 있는 경우 취약하다고 판단한다.
- 정탐코드의 예 -
다음 예제는 외부에서 읽어 들인 패스워드를 암호화하지 않고 네트워크를 통하여 서버에 전송하고 있다. 이 경우 패킷 스니핑을 통하여 패스워드가 노출될 수 있기 때문에 보안약점이 존재하는 코드 이다. 또한 임시 변수 password는 값의 사용 후 반드시 초기화 해주어야 한다.
1: void foo()
2: {
3: try {
4: Socket socket = new Socket(“taranis”, 4444);
5: PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
6: String password = getPassword();
7: out.write(password);
8: } catch (FileNotFoundException e) {
9: …
- 정탐코드의 예 -
다음 예제는 중요정보에 접근 가능한 URL을 일반 채널을 이용하여 연결하는 예제이다. 따라서 해당 채널에서 주고받는 데이터는 외부에서 쉽게 확인이 가능하고 공격에 활용될 수 있다. 보안 채널을 이용하고 있지 않기 때문에 보안약점을 가지고 있는 코드라고 진단할 수 있다.
1: try {
2: URL u = new URL(“http://www.secret.example.org/”);
3: HttpURLConnection hu = (HttpURLConnection) u.openConnection();
4: hu.setRequestMethod(“PUT”);
5: hu.connect();
6: OutputStream os = hu.getOutputStream();
7: hu.disconnect();
8: } catch (IOException e) {
9: //…
10: }
'보안 공부 > 소스코드 보안약점 진단' 카테고리의 다른 글
소스코드 보안약점 진단 - 충분하지 않은 키 길이 사용 (0) | 2022.01.11 |
---|---|
소스코드 보안약점 진단 - 하드코드된 비밀번호 (0) | 2022.01.10 |
소스코드 보안약점 진단 - 중요정보 평문저장 (0) | 2022.01.06 |
소스코드 보안약점 진단 - 취약한 암호화 알고리즘 사용 (0) | 2022.01.05 |
소스코드 보안약점 진단 - 중요한 자원에 대한 잘못된 권한 설정 (0) | 2022.01.04 |