보안 공부/소스코드 보안약점 진단

소스코드 보안약점 진단 - 중요한 자원에 대한 잘못된 권한 설정

H.J.World 2022. 1. 4. 10:10
728x90
반응형

소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.

SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.

해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.

 

제2절 보안기능

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현시 발생할 수 있는 보안 약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.


3. 중요한 자원에 대한 잘못된 권한 설정

가. 개요

SW가 중요한 보안관련 자원에 대하여 읽기 또는 수정하기 권한을 의도하지 않게 허가할 경우, 권한 을 갖지 않은 사용자가 해당자원을 사용하게 된다.

나. 보안대책

설정파일, 실행파일, 라이브러리 등은 SW 관리자에 의해서만 읽고 쓰기가 가능하도록 설정하고 설정 파일과 같이 중요한 자원을 사용하는 경우, 허가받지 않은 사용자가 중요한 자원에 접근 가능한 지 검사한다.

다. 코드예제

"/home/setup/system.ini" 파일에 대해 모든 사용자가 읽고, 쓰고, 실행할 수 있도록 권한을 부여하고 있다.

- setExecutable(p1, p2) : 첫 번째 파라미터의 true/false 값에 따라 실행가능 여부를 결정한다. 두 번째 파라미터가 true 일 경우 소유자만 실행권한을 가지며, false 일 경우 모든 사용자가 실행 권한을 가진다. 

- setReadable(p1, p2) : 첫 번째 파라미터의 true/false 값에 따라 읽기가능 여부를 결정한다. 두 번째 파라미터가 true 일 경우 소유자만 읽기권한을 가지며, false 일 경우 모든 사용자가 읽기 권한을 가진다.

- setWritable(p1, p2) : 첫 번째 파라미터의 true/false 값에 따라 쓰기가능 여부를 결정한다. 두 번째 파라미터가 true 일 경우 소유자만 쓰기권한을 가지며, false 일 경우 모든 사용자가 쓰기 권한을 가진다.

 

- 안전하지 않은 코드의 예 JAVA -

1: File file = new File("/home/setup/system.ini");
//모든 사용자에게 실행 권한을 허용하여 안전하지 않다.
2: file.setExecutable(true, false);
//모든 사용자에게 읽기 권한을 허용하여 안전하지 않다.
3: file.setReadable(true, false);
//모든 사용자에게 쓰기 권한을 허용하여 안전하지 않다.
4: file.setWritable(true, false);

 

- 안전한 코드의 예 JAVA -

파일에 대해서는 최소권한을 할당해야 한다. 즉 해당 파일의 소유자에게만 읽기 권한을 부여한다.

- setExecutable(p1) : 파라미터의 true/false 값에 따라 소유자의 실행권한 여부를 결정한다.

- setReadable(p1) : 파라미터의 true/false 값에 따라 소유자의 읽기권한 여부를 결정한다.

- setWritable(p1) : 파라미터의 true/false 값에 따라 소유자의 쓰기권한 여부를 결정한다.

1: File file = new File("/home/setup/system.ini");
//소유자에게 실행 권한을 금지하였다.
2: file.setExecutable(false);
//소유자에게 읽기 권한을 허용하였다.
3: file.setReadable(true);
//소유자에게 쓰기 권한을 금지하였다.
4: file.setWritable(false);

 

라. 진단방법

해당 취약점은 보안특성 중 중요자원에 대한 접근 권한 설정과 관련된 취약점으로 정적도구를 사용 하여 중요자원이 무엇인지 판단하는 것은 어려운 작업이다. 이에 따라 진단원이 직접 중요자원을 식별하고 이에 대한 취약성을 판단하는 것이 필요하다.

SW에서 생성하는 중요자원(파일 등)이 존재하는지 식별한다. 사용자 업로드파일, 프로그램이 사용 하는 설정파일 등 중요자원에 대해 읽기, 쓰기, 실행 등의 권한을 사전에 정의하였는지 확인하고 사전 에 정의한 권한대로 중요자원에 접근권한을 허용하는지 확인한다. 설정파일, 문서파일의 경우 실행 권한이 설정되지 않았는지 확인하여야 한다.

SW가 중요한 보안관련 자원에 대하여 읽기 또는 수정하기 권한을 의도하지 않게 허가할 경우, 권한 을 갖지 않은 사용자가 해당자원을 사용하게 된다.

1: // 파일 권한 : rw-rw-rw-, 디렉터리 권한 : rwxrwxrwx
2: String cmd = “umask 0”;
3: File file = new File(“/home/report/report.txt”);
4: …
5: Runtime.getRuntime().exec(cmd);

 

- 오탐코드의 예 -

아래 코드는 4 ~ 6번 라인에서 실행권한과 쓰기권한은 제외하고 읽기 권한만 부여하고 있어 취약하지 않다

1: try {
2: ......
3: File file = new File(“/home/setup/system.ini”);
4: file.setExecutable(false);
5: file.setReadable(true);
6: file.setWritable(false);
7:
8: if (file.createNewFile()) {
9: System.out.println(“File is created!”);
10: } else {
11: System.out.println(“File already exists.”);
12: }
13: } catch (IOException e) {
14: ......
15: }
728x90
반응형