소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.
SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.
해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.
제2절 보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현시 발생할 수 있는 보안 약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
15. 무결성 검사 없는 코드 다운로드
가. 개요
원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드 받고, 이를 실행하는 제품들이 종종 존재한다. 이는 호스트 서버의 변조, DNS 스푸핑 (Spoofing) 또는 전송시의 코드 변조 등의 방법 을 이용하여 공격자가 악의적인 코드를 실행할 수 있도록 한다.
나. 보안대책
DNS 스푸핑(Spoofing)을 방어할 수 있는 DNS lookup을 수행하고 코드 전송시 신뢰할 수 있는 암호 기법을 이용하여 코드를 암호화한다. 또한 다운로드한 코드는 작업 수행을 위해 필요한 최소한 의 권한으로 실행하도록 한다.
다. 코드예제
이 예제는 URLClassLoader()를 통해 원격에서 파일을 다운로드한 뒤 로드하면서, 대상 파일에 대한 무결성 검사를 수행하지 않아 파일변조 등으로 인한 피해가 발생할 수 있는 경우이다. 이러한 경우 공격자는 악의적인 실행코드로 클래스의 내용을 수정할 수 있다.
- 안전하지 않은 코드의 예 JAVA -
1: URL[] classURLs = new URL[] { new URL("file:subdir/") };
2: URLClassLoader loader = new URLClassLoader(classURLs);
3: Class loadedClass = Class.forName("LoadMe", true, loader);
- 안전한 코드의 예 JAVA -
이를 안전한 코드로 변환하면 다음과 같다. 클래스를 로드하기 전 클래스의 체크섬(Checksum)을 실행하여 로드하는 코드가 변조되지 않았음을 확인한다
// 공개키 방식의 암호화 알고리즘과 메커니즘을 이용하여 전송파일에 대한 시그니처를 생성하고 파일의
변조유무를 판단한다. 서버에서는 Private Key를 가지고 MyClass를 암호화한다.
1: String jarFile = "./download/util.jar";
2: byte[] loadFile = FileManager.getBytes(jarFile);
3: loadFile = encrypt(loadFile, privateKey);
// jarFileName으로 암호화된 파일을 생성한다.
4: FileManager.createFile(loadFile, jarFileName);
// 클라이언트에서는 파일을 다운로드 받을 경우 Public Key로 복호화한다.
5: URL[] classURLs = new URL[] { new URL("http://filesave.com/download/util.jar") };
6: URLConnection conn = classURLs.openConnection();
7: InputStream is = conn.getInputStream();
// 입력 스트림을 jarFile명으로 파일을 출력한다.
8: FileOutputStream fos = new FileOutputStream(new File(jarFile));
9: While (is.read(buf) != -1) {
10: ......
11: }
12: byte[] loadFile = FileManager.getBytes(jarFile);
13: loadFile = decrypt(loadFile, publicKey);
// 복호화된 파일을 생성한다.
14: FileManager.createFile(loadFile, jarFile);
15: URLClassLoader loader = new URLClassLoader(classURLs);
16: Class loadedClass = Class.forName("MyClass", true, loader);
라. 진단방법
클래스를 로드하기 위한 코드를 확인(①)하고 클래스를 로드하기 전에 체크섬을 실행 및 비교하여 로드하려는 코드가 변조되지 않았음을 확인하다. 다음의 예제에서는 로드하려는 클래스의 체크섬을 비교하여 무결성을 확인하고 있지 않으므로 취약하다고 판정한다.
1: URL[] classURLs = new URL[]{
2: new URL(“file:subdir/”)
3: };
4: URLClassLoader loader = new URLClassLoader(classURLs);
5: Class loadedClass = Class.forName(“LoadMe”, true, loader);--------①
'보안 공부 > 소스코드 보안약점 진단' 카테고리의 다른 글
소스코드 보안약점 진단 - 경쟁조건: 검사 시점과 사용 시점(TOCTOU) (0) | 2022.01.24 |
---|---|
소스코드 보안약점 진단 - 반복된 인증시도 제한 기능 부재 (0) | 2022.01.21 |
소스코드 보안약점 진단 - 솔트 없이 일방향 해시함수 사용 (0) | 2022.01.19 |
소스코드 보안약점 진단 - 주석문 안에 포함된 시스템 주요정보 (0) | 2022.01.18 |
소스코드 보안약점 진단 - 사용자 하드디스크에 저장되는 쿠키를 통한 정보노출 (0) | 2022.01.17 |