문제 상황
소프트웨어 개발 구현 단계에서 검증해야하는 보안 점검 내용은 총 7가지로, 입력 데이터 검증 및 표현, 보안 기능, 시간 및 상태, 에러처리, 코드 오류, 캡슐화, API 오용이 있습니다. 이중 입력 데이터 검증 및 표현, 보안 기능, 코드 오류, 캡슐화 부분에 대해서 정리하겠습니다.
입력 데이터 검증 및 표현
입력 데이터 검증 및 표현은 입력 데이터로 인한 문제를 예방하기 위해 구현 단계에서 반드시 검증해야 하는 보안 점검 항목입니다.
- SQL 삽입(SQL Injection)
- 웹 응용 프로그램에 SQL을 삽입하여 내부 데이터베이스 서버의 데이터를 유출 및 변조하고, 관리자 인증을 우회하는 보안 약점입니다.
- 동적 쿼리에서 사용하는 입력 데이터가 예약어 및 특수 문자가 입력되지 않도록 필터링하게 설정하여 방지할 수 있습니다.
- 경로 조작 및 자원 삽입
- 데이터 입출력 경로를 조작하여 서버 자원을 수정 및 삭제할 수 있는 보안 약점입니다.
- 사용자 입력값을 식별자로 사용하는 경우, 경로 순회 공격을 막는 필터를 사용하여 방지할 수 있습니다.
- 크로스사이트 스크립팅(XSS)
- 웹페이지에 악의적인 스크립트를 삽입하여 방문자들의 정보를 탈취하거나 비정상적인 기능 수행을 유발하는 보안 약점입니다.
- HTML 태그 사용을 제한하거나 스크립트가 삽입되지 않도록 ‘<’, ‘>’ 같은 문자를 다른 문자로 치환함으로써 방지할 수 있습니다.
- 운영체제 명령어 삽입
- 외부 입력값을 통해 시스템 명령어의 실행을 유도함으로써 권한을 탈취하거나 시스템 장애를 유발하는 보안 약점입니다.
- 웹 인터페이스를 통해 시스템 명령어가 전달되지 않도록 하고, 외부 입력값을 검증 없이 내부 명령어로 사용하지 않음으로써 방지할 수 있습니다.
- 위험한 형식 파일 업로드
- 악의적인 명령어가 포함된 스크립트 파일을 업로드함으로써 시스템에 손상을 주거나 시스템을 제어할 수 있는 보안 약점입니다.
- 업로드되는 파일의 확장자 제한, 파일 명의 암호화, 웹사이트와 파일 서버의 경로 분리, 실행 속성 제거 등의 방법으로 방지할 수 있습니다.
- 신뢰되지 않는 URL 주소로의 자동 접속 연결
- 입력 값으로 사이트 주소를 받는 경우, 이를 조작하여 방문자를 피싱 사이트로 유도하는 보안 약점입니다.
- 연결되는 외부 사이트의 주소를 화이트리스트로 관리함으로써 방지할 수 있습니다.
- 메모리 버퍼 오버플로
- 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에서 자료를 읽거나 쓰려고 할 때 발생하는 보안 약점입니다.
- 메모리 버퍼를 사용할 경우 적절한 버퍼의 크기를 설정하고 설정된 범위의 메모리 내에서 올바르게 읽거나 쓸 수 있도록 함으로써 방지할 수 있습니다.
보안 기능
보안 기능은 소프트웨어 개발의 구현 단계에서 인증, 접근 제어, 기밀성, 암호화 등을 올바르게 구현하기 위해 중요한 보안 점검 항목들입니다.
- 적절한 인증 없이 중요한 기능 허용
- 보안 검사를 우회하여 인증 과정 없이 중요한 정보나 기능에 접근 및 변경이 가능합니다.
- 중요한 정보나 기능을 수행하는 페이지에서는 재인증 기능을 수행하도록 하여 이를 방지할 수 있습니다.
- 부적절한 인가
- 접근 제어 기능이 없는 실행 경로를 통해 정보나 권한을 탈취할 수 있습니다.
- 모든 실행 경로에 대해 접근 제어 검사를 수행하고, 사용자에게는 반드시 필요한 접근 권한만을 부여하여 방지할 수 있습니다.
- 중요한 자원에 대한 잘못된 권한 설정
- 권한 설정이 잘못된 자원에 접근하여 해당 자원을 임의로 사용할 수 있습니다.
- 소프트웨어 관리자만 자원들을 읽고 쓸 수 있도록 설정하고, 인가되지 않은 사용자의 중요 자원에 대한 접근 여부를 검사함으로써 방지할 수 있습니다.
- 취약한 암호화 알고리즘 사용
- 암호화된 환경 설정 파일을 해독하여 비밀번호 등의 중요 정보를 탈취할 수 있습니다.
- 안전한 암호화 알고리즘을 사용하고, 업무 관련된 내용이나 개인 정보 등에 대해서는 IT 보안 인증 사무국이 안정성을 확인한 암호 모듈을 사용함으로써 방지할 수 있습니다.
- 중요한 정보의 평문 저장 및 전송
- 암호화되지 않은 평문 데이터를 탈취하여 중요한 정보를 획득할 수 있습니다.
- 중요한 정보를 저장하거나 전송할 때에는 반드시 암호화 과정을 거치도록 하고, HTTPS나 SSL과 같은 보안 채널을 이용함으로써 방지할 수 있습니다.
- 하드 코딩된 암호화 키
- 하드 코딩된 암호화 키가 유출될 경우 역계산 또는 무차별 대입 공격에 의해 탈취될 수 있습니다.
- 상수 형태의 암호화 키를 사용하지 않고, 암호화 키 생성 모듈 또는 보안이 보장된 외부 공간을 이용함으로써 방지할 수 있습니다.
코드 오류
코드 오류는 소프트웨어 구현 단계에서 개발자들이 코딩 중 실수하기 쉬운 오류를 예방하기 위한 보안 점검 항목입니다.
- 널 포인터 역참조
- 널 포인터가 가리키는 메모리 위치에 값을 저장할 때 발생하는 보안 약점입니다.
- 포인터를 이용하기 전에 널 값을 갖고 있는지를 검사함으로써 방지할 수 있습니다.
- 부적절한 자원 해제
- 자원을 반환하는 코드를 누락하거나 프로그램 오류로 할당된 자원을 반환하지 못했을 때 발생하는 보안 약점입니다.
- 프로그램 내에 자원 반환 코드가 누락되었는지 확인하고, 오류로 인해 함수가 중간에 종료되었을 때 예외 처리에 관계 없이 자원이 반환되도록 코딩함으로써 방지할 수 있습니다.
- 해제된 자원 사용
- 이미 사용이 종료되어 반환된 메모리를 참조하는 경우 발생하는 보안 약점입니다.
- 반환된 메모리에 접근할 수 없도록 주소를 저장하고 있는 포인터를 초기화함으로써 방지할 수 있습니다.
- 초기화되지 않은 변수 사용
- 변수 선언 후 값이 부여되지 않은 변수를 사용할 때 발생하는 보안 약점입니다.
- 변수 선언 시 할당된 메모리를 초기화함으로써 방지할 수 있습니다.
캡슐화
캡슐화는 정보 은닉이 필요한 중요한 데이터와 기능을 불완전하게 캡슐화하거나 잘못 사용함으로써 발생할 수 있는 문제를 예방하기 위한 보안 점검 항목입니다.
- 잘못된 세션에 의한 정보 노출
- 다중 스레드 환경에서 멤버 변수에 정보를 저장할 때 발생하는 보안 약점입니다.
- 멤버 변수보다는 지역 변수를 활용하여 변수의 범위를 제한함으로써 방지할 수 있습니다.
- 제거되지 않고 남아있는 디버그 코드
- 개발 중에 버그 수정이나 결과값 확인을 위해 남겨둔 코드들로 인해 발생하는 보안 약점입니다.
- 소프트웨어 배포 전에 코드 검사를 수행하여 남아있는 디버그 코드를 삭제함으로써 방지할 수 있습니다.
- 시스템 데이터 정보 노출
- 시스템의 내부 정보를 시스템 메시지 등을 통해 외부로 출력하도록 코딩했을 때 발생하는 보안 약점입니다.
- 노출되는 메시지에는 최소한의 정보만을 제공함으로써 방지할 수 있습니다.
- Public 메소드로부터 반환된 Private 배열
- 선언된 클래스 내에서만 접근이 가능한 Private 배열을 모든 클래스에서 접근 가능한 Public 메소드에서 반환할 때 생기는 보안 약점입니다.
- Private 배열을 별도의 메소드를 통해서 조작하거나, 동일한 형태의 복제본으로 반환받은 후 값을 전달하는 방식으로 방지할 수 있습니다.
- Private 배열에 Public 데이터 할당
- Private 배열에 Public으로 선언된 데이터 또는 메소드의 파라미터를 저장할 때 생기는 보안 약점입니다.
- Public으로 선언된 데이터를 Private 배열에 저장할 때, 레퍼런스가 아닌 값을 직접 저장함으로써 방지할 수 있습니다.
'질문 정리' 카테고리의 다른 글
[Dagger/MissingBinding] UserData cannot be provided without an @Provides-annotated method. (0) | 2024.07.13 |
---|---|
[Dagger/DependencyCycle] Found a dependency cycle (0) | 2024.07.12 |
Secure SDLC이란 무엇일까? (0) | 2024.07.03 |
안드로이드에서 CRC32로 무결성 체크하기 (0) | 2024.07.02 |
안드로이드 PDF 파일 저장하기 구현 (1) | 2024.06.28 |