시큐어코딩

시큐어코딩 (4) - CH 01-3

vitamin3000 2025. 4. 13. 17:49

 

1. 소프트웨어 보안과 시큐어 코딩

  • 포인터 공격
    • 제어 데이터 공격
    • non-control 공격
  • 경쟁 조건(자원 독점) 공격
    • 검사 시점, 사용 시점
    • 프로그램과 프로그램 또는 사용자 사이의 상호작용
    • 파일 변조
    • 메모리 변조
    • 데드락
      • 서로 공유되는 , 참조되는 자원을 양보안해서 시스템 실행을 못함
  • 제어 데이터(프로그램 실행 흐름) 공격
    • 간접 분기에 사용되는 데이터에 침입자가 원하는 주소를 기록
    • 스택 프레임의 반환 주소(PC Program Count)
      • toc, tou 실행흐름 여러개로 사용 보장이 안됨
      • java에서는 Sync(동기화)로 해결
    • 함수 포인터
    • 라이브러리와 같은 공유 객체 연결 포인터
  • non-control 공격
    • 환경 설정 데이터
    • 사용자 입력
    • 사용자 신분 데이터
    • 분기 결정 데이터

2. C 시큐어 코딩 : C언어의 문제점

취약성 연관 C언어 특성

  • 약한 타입 체계 
  • 포인터 ; 가상 메모리 직접 접근
  • 배열
  • 매크로와 전처리기 : 원시 파일 포함, 조건부 컴파일

 

3. 파일 이름으로 identification 금지

 

아래 코드는 취약한 프로그램의 예로, 파일을 불러오는 함수이다

char *file_name = "testfile"
FILE *f_ptr;

f_ptr = fopen(file_name, "w");
if (F_ptr == NULL){
	/* Handle Error */
 }
 
 /* ... /*
 
 if (chmod(file_name, S_IRUSR) == -1) {
	/* Handle Error */
}

 

chmod에서의 filename과 fopen()의 filename이 동일한 파일인지 확신할 수 없다.

 

시큐어 코딩한 프로그램의 에는 다음과 같다.

char *file_name = "testfile"
int fd;

fd = open(file_name, O_WRONLY | O_CREAT | O_EXCL, S_IRWXU);

if (fd == -1){
	/* Handle Error */
 }
 /* ... */
 
 if(fchmod(fd, S_IRUSR) == -1) {
 	/* Handle Error */
}

 

파일 디스크립터를 통하여 파일 권한을 변화시켜서 open()으로 열었던 파일과 동일한 파일임을 보장할 수 있다.

 

4. Java 시큐어 코딩

  • 언어적인 관점
    • 잘 정의된 수치적 연산
    • 명시적 포인터를 사용하지 않음
    • 플랫폼 독립적인 실행
  • 잘 정의된 예외 검사 및 처리
    • 언어 수준에서 예외 처리 문장을 제공
      • 복구 가능한, exception 핸들링 가능
    • 예외 클래스
      • 예외를 객체로 처리
    • 미리 정의된 다양한 에외를 제공(시스템 예외)
      • 자동으로 배열과 문자열의 영역 검사 수행
      • 널 포인터 참조를 검사
  • 네트워크 상의 클래스 파일을 실행하기 전에 보안 검사 수행
    • Bytecode Verifier
      • bytecode 명령어에 대한 분석 수행
        • 접근 제한 규칙 준수
        • 타입 일치 여부
    • Class Loader
      • 클래스 파일을 실행하기 위해 JVM으로 로딩
        • JVM : 자바 바이트코드를 실행하는 가상 컴퓨터
      • 네트워크 상에 존재하는 클래스 파일과 로컬 클래스 파일에 대한 분석 수행
      • 자바의 등장으로 프로그램도 공유 가능
  • mutable 변수(외부 요건에 의해 값이 변경되지 않음을 의미)일지라도, 공유 변수는 반드시 동기화하여 사용할 것
    • 동기화하지 않은 프로그래밍 습관
    • 컴파일러에 의해 코드의 순서가 변경되는 경우가 발생
      • 멀티스레드에서 할당되지 않은 변수가
      • null이 아닌 경우가 발생
    • 따라서 공유변수가 다음과 같은 일관성을 유지하도록 동기화 문장을 사용