IgnatiusHeo

구현단계 보안약점 제거 기준-부적절한 전자서명 확인 본문

자격/SW보안약점진단원

구현단계 보안약점 제거 기준-부적절한 전자서명 확인

Ignatius Heo 2023. 7. 4. 21:30

작성일: 230704

 

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

 

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

구분 - 입력데이터 검증 및 표현
설계단계 - 업로드·다운로드 파일 검증
https://cryptocurrencyclub.tistory.com/98
개요
전자서명이란 서명자의 신원을 확인하고 서명된 파일의 무결성을 보장할 수 있는 디지털 정보이다.

전자서명이 사용된 경우, 전자서명을 검증하지 않거나 검증절차가 부적절하면 위변조된 파일으로 악성코드에 감염될 수 있으므로 전자서명을 확인하여 위변조 여부를 판별하고 사용해야 한다.

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

 ① 업로드되어 저장되는 파일의 타입, 크기, 개수, 실행권한을 제한해야 한다. 업로드되는 파일의 타입, 크기, 개수 및 실행권한을 제한하도록 설계하고 있는지 확인한다.

  ㅇ  업로드 가능한 파일의 타입, 크기, 개수와 저장 시 파일의 퍼미션을 정의하고 있는지 확인(업로드 기능을 지원하는 프레임워크, 라이브러리 사용 여부 확인 후 파일 속성 제한 설정 여부 확인)
  ㅇ  허용되지 않는 파일 타입, 크기, 개수 업로드의 제한 기능 테스트 계획 수립 여부 확인
  ㅇ  업로드 후 서버에 저장된 파일의 실행 제한 여부 점검 테스트 계획 수립 여부 확인
 
 ② 업로드되어 저장되는 파일은 외부에서 식별되지 않아야 한다. 업로드된 파일을 외부에서 식별되거나 직접 접근할 수 없도록 설계하고 있는지 확인한다.
  ㅇ  저장 경로와 파일명을 외부에서 알 수 없도록 정의하는지 확인(난수 + 중복 안되도록)
  ㅇ  원본 파일명과 저장경로/파일명의 매핑정보를 관리하도록 설계되어 있는지 확인
  ㅇ  저장된 파일명, 경로가 외부에서 식별 가능한지 점검할 수 있는 테스트 계획 수립 여부 확인
 
 ③ 파일 다운로드 요청 시, 요청파일명에 대한 검증작업을 수행해야 한다. 파일 다운로드 요청 시 파일에 대한 검증작업이 이루어지도록 설계하고 있는지 확인한다.
  ㅇ  파일 다운로드 요청방식의 안전한 설계 여부 확인(경로 조작 문자 포함 여부, DB정보를 이용하여 요청파일의 유효성 점검 여부)
  ㅇ  조작된 파일명을 이용한 파일 다운로드 요청의 차단 여부 확인
 
 ④ 다운로드받은 소스코드나 실행파일은 무결성 검사를 실행해야 한다. 다운로드받은 소스코드와 실행파일에 대해 무결성을 검증하도록 설계하고 있는지 확인한다.
  ㅇ  파일의 무결성 검사를 위한 값(예: 해시)의 제공 여부 확인
  ㅇ  무결성 검사 수행 후 파일 다운로드하도록 절차가 설계되어 있는지 확인
  ㅇ  변조된 파일에 대한 다운로드 처리가 차단되는지 점검할 수 있는 테스트 계획의 수립 여부 확인

보안대책
(구현단계)

전자서명을 포함하는 파일을 사용할 때는 항상 전자서명을 확인하여야 한다.

이 경우, 전자서명 파일의 출처 등을 확인하여 신뢰할 수 없는 곳에서 생성된 파일을 사용하지 않도록 한다.

진단방법
(구현단계)

JarFile을 생성할 때 전자서명 여부를 확인하는 Boolean형 파라미터가 있는 생성자를 사용하여 전자
서명 여부를 검증하는지 확인한다.

또한 JarEntry.getCodeSigners() 메소드로 전자서명 주체 검증여부를 확인한다.

 

다. 코드예제

 

ㅇ 분석

1: File f = new File(downloadedFilePath);
2: JarFile jf = new JarFile(f);

ㅇ 내용

1. 파일 서명을 확인하지 않고 사용함...?

 

ㅇ 수정

1:File f = new File(downloadedFilePath);
2:JarFile jf = new JarFile(f, true);
3:Enumeration<JarEntry> ens = jf.entries();
4:while (ens.hasMoreElements()) {
5: JarEntry en = ens.nextElement();
6: if (!en.isDirectory()) {
7: if (en.toString().equals(path)) {
8: byte[] data = readAll(jar.getInputStream(en), en.getSize());
9: CoeSigner[] signers = en.getCodeSigners();
10: ...
11: }
12: }
13:}
14:jf.close();

ㅇ 내용

1. JarFile 생성자에 boolean형 파라미터를 사용하여 전자서명을 확인한다. 전자서명 여부를 확인 후, JarEntry.getCodeSigners() 메소드를 사용하여 JAR 객체에 대한 전자서명 주체를 신뢰 할 수 있는지 확인하여야 한다.

쿠키의 만료시간은 해당 기능에 맞춰 최소로 설정하고 영속적인 쿠키에는 중요 정보가 포함되지 않도록 한다.

 

 

 

끝.