IgnatiusHeo

구현단계 보안약점 제거 기준-중요한 자원에 대한 잘못된 권한 설정 본문

자격/SW보안약점진단원

구현단계 보안약점 제거 기준-중요한 자원에 대한 잘못된 권한 설정

Ignatius Heo 2023. 7. 4. 19:42

작성일: 230704

 

※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.

 

정리 내용: 소프트웨어 보안약점 진단 가이드(325~329p)

구분 - 보안기능
설계단계 - 중요자원 접근통제
https://cryptocurrencyclub.tistory.com/103
개요
SW가 중요한 보안관련 자원에 대하여 읽기 또는 수정하기 권한을 의도하지 않게 허가할 경우, 권한을 갖지 않은 사용자가 해당자원을 사용하게 된다.

진단 세부사항
(설계단계)

 ① 중요자원에 대한 접근통제 정책을 수립하여 적용해야 한다. 중요자원에 대한 접근통제가 이루어지도록 설계되어 있는지 확인한다.
  ㅇ  중요자원의 식별 여부 확인
  ㅇ  중요자원에 접근하는 사용자/프로그램 분류 여부 확인
  ㅇ  중요자원에 접근하는 사용자/프로그램의 접근권한이 최소권한으로 할당되도록 설계되어 있는지 확인
  ㅇ  중요자원에 접근하는 사용자/프로그램의 접근권한이 자원별로 분리되어 할당되도록 설계되어 있는지 확인
  ㅇ  중요자원에 대한 접근통제 정책(ACL/RBAC)이 설정되고 접근통제 기능을 구현하는 프로그램이 설계되어 있거나 접근통제 기능을 제공하는 라이브러리를 활용하도록 설계되어 있는지 확인
  ㅇ  접근통제 기능의 적용방식이 프레임워크의 컴포넌트를 활용하여 적용하여 경우, 중요자원을 사용하는 모든 요청에 적용될 수 있도록 설계되어 있는지 확인
  ㅇ  접근통제 기능의 적용방식이 개별 프로그램에서 적용하는 경우, 대상 프로그램과 통제 기능 호출방식에 대한 코딩규칙이 개발가이드에 반영되어 있는지 확인
  ㅇ  중요자원별로 할당된 접근 권한 외의 작업을 요청하여 접근권한 통제가 안전하게 수행되는지를 점검하기 위한 테스트 계획의 수립 여부 확인
 
 ② 중요기능에 대한 접근통제 정책을 수립하여 적용해야 한다. 중요기능에 대한 접근통제가 설계되어 있는지 확인한다.
  ㅇ  중요기능이 분석 단계 산출물에서 식별되어 있는지 확인
  ㅇ  중요기능에 접근하는 사용자/프로그램이 분류되어 있는지 확인
  ㅇ  중요자원에 접근하는 사용자/프로그램의 접근권한이 최소권한으로 할당되도록 설계되어 있는지 확인
  ㅇ  중요자원에 접근하는 사용자/프로그램의 접근권한이 자원별로 분리되어 할당되도록 설계되어 있는지 확인
  ㅇ  중요자원에 대한 ACL/RBAC 등이 설정되고 접근 통제 기능을 구현하는 프로그램이 설계되어 있거나 접근통제 기능을 제공하는 라이브러리를 활용하도록 설계되어 있는지 확인
  ㅇ  접근통제 기능의 적용방식이 프레임워크의 컴포넌트를 활용하여 적용하는 경우, 중요자원을 사용하는 모든 요청에 적용될 수 있도록 설계되어 있는지 확인
  ㅇ  접근통제 기능의 적용방식이 개별 프로그램에서 적용하는 경우, 대상 프로그램과 통제 기능 호출 방식에 대한 코딩규칙이 개발가이드에 반영되어 있는지 확인
 
 ③ 관리자 페이지에 대한 접근통제 정책을 수립하여 적용해야 한다. 관리자 페이지 접근통제 정책이 설계되어 있는지 확인한다.
  ㅇ  관리자 페이지를 사용하는 포트가 일반 사용자 페이지와 다른 포트를 사용하고 있는지 확인
  ㅇ  외부 네트워크로부터 관리자 페이지의 접근 차단 설계 여부 확인
  ㅇ  관리자 페이지에 접근 가능한 IP주소의 정의/설계 반영 여부 확인
  ㅇ  관리자 페이지 접속 시 반드시 암호화된 통신의 사용 설계 여부 확인
  ㅇ  관리자 페이지 접속 시 접속자, 접속페이지 정보의 로깅 기능 설계 여부 확인

보안대책
(구현단계)

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

진단방법
(구현단계)
해당 취약점은 보안특성 중 중요자원에 대한 접근 권한 설정과 관련된 취약점으로 정적도구를 사용하여 중요자원이 무엇인지 판단하는 것은 어려운 작업이다.

이에 따라 진단원이 직접 중요자원을 식별하고 이에 대한 취약성을 판단하는 것이 필요하다.

SW에서 생성하는 중요자원(파일 등)이 존재하는지 식별한다.

사용자 업로드 파일, 프로그램이 사용하는 설정파일 등 중요자원에 대해 읽기, 쓰기, 실행 등의 권한을 사전에 정의하였는지 확인하고 사전에 정의한 권한대로 중요자원에 접근권한을 허용하는지 확인한다.

설정파일, 문서파일의 경우 실행 권한이 설정되지 않았는지 확인하여야 한다.

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

 

다. 코드예제

 

ㅇ 분석

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

ㅇ 내용

1. 그럼 권한 설정을 어떤식으로 해야함??

 

ㅇ 수정

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

ㅇ 내용

1. rwx 권한 설정하듯 하면 되나봄. 근데 권한 부여받는 사람이 소유자라는건 어떻게 확인함?

 


ㅇ 분석

1: public static void AddDirectorySecurity(string FileName)
2: {
// 디렉토리 정보 객체 생성
3: DirectoryInfo dInfo = new DirectoryInfo(FileName);
4: DirectorySecurity dSecurity = dInfo.GetAccessControl();
// 모든 사용자에게 권한 부여.
5: dSecurity.AddAccessRule(new FileSystemAccessRule("everyone",
FileSystemRights.FullControl,
InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
6: dInfo.SetAccessControl(dSecurity);
7: }

ㅇ 내용

1. 디렉토리에 대한 ACL은 설정해야하지 않을까

 

ㅇ 수정

1: public static void AddDirectorySecurity(string FileName, string Account,
FileSystemRights Rights, AccessControlType ControlType)
2: {
// 디렉토리 정보 객체 생성
3: DirectoryInfo dInfo = new DirectoryInfo(FileName);
4: DirectorySecurity dSecurity = dInfo.GetAccessControl();
// FileSystemAccessRule 에 권한 설정
5: dSecurity.AddAccessRule(new FileSystemAccessRule(Account,
Rights,
ControlType));
6: dInfo.SetAccessControl(dSecurity);
6:
7:

ㅇ 내용

1. r5에 설정하듯


ㅇ 분석

//모든 사용자가 읽기/쓰기 권한을 갖게 됩니다.
1: umask(0);
2: FILE *out = fopen("file_name", "w");
3: if(out){
4: fprintf(out, "secure code\n");
5: fclose(out);

ㅇ 내용

1. umask(0)를 사용하고 명령어를 실행하면 모든 권한이 부여된 상태로 실행됨

 

ㅇ 수정

//유저 외에는 아무런 권한을 주지 않습니다.
1: umask(077);
2: FILE *out = fopen("file_name", "w");
3: if(out){
4: fprintf(out, "secure code\n");
5: fclose(out);

ㅇ 내용

1. umask(077)은 소유자 외 다른 모든 사용자에게 어떤 권한을 허용하지 않음.

 

 

 

 

끝.