소프트웨어 보안약점 진단가이드
2021.11 개정안 기준으로 작성
- 이후 내용이 수정될 수 있습니다.
[항목]
- DBMS 조회 및 결과 검증
[유형]
- 입력데이터 검증 및 표현
[기준]
- DBMS 조회시 질의문(SQL) 내 입력값과
그 조회결과에 대한 유효성 검증방법(필터링 등) 설계 및
유효하지 않은 값에 대한 처리방법을 설계해야 한다.
[보안 대책]
- 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.
- 외부입력값이 삽입되는 SQL질의문을 동적으로 생성해서 실행하지 않도록 해야 한다.
- 외부입력값을 이용해 동적으로 SQL질의문을 생성해야 하는 경우,
입력값에 대한 검증을 수행한 뒤 사용해야 한다.
[구현단계 관련 보안약점]
- 입력 데이터 검증 및 표현 > SQL 삽입
취약점 개요: SQL 삽입(Injection)
데이터베이스(DB)와 연동된 응용프로그램에서
입력된 데이터에 대한 유효성 검증을 하지 않을 경우,
공격자가 입력데이터에 SQL 질의문을 삽입하여
DB로부터 정보를 열람하거나 조작할 수 있는 보안 취약점을 말한다.
설계 시 고려사항(보안 대책)
보안 대책의 세부 내용 입니다.
1. 애플리케이션에서 DB연결을 수행할 때
최소권한의 계정을 사용해야 한다.
- 취약한 애플리케이션으로 인해 침해사고가 발생하더라도
나머지 부분에 대해 공격자가 액세스 권한을 가지지 않도록
애플리케이션에서 사용하는 DB연결 계정은
해당 애플리케이션이 사용하는
데이터에 대한 읽기, 쓰기, 삭제, 업데이트 권한만 설정한다.
2. 외부 입력값이 삽입되는 SQL질의문을
동적으로 생성해서 실행하지 않도록 해야 한다.
- SQL 질의문의 구조가
외부 입력값에 의해 변경되지 않는 API를 사용하도록
시큐어코딩 규칙을 지정 한다.
ORM프레임워크를 사용하여 안전한 정적쿼리구조로
SQL문을 수행할 수 있도록 개발환경을 설정하고,
ORM프레임워크에서 제공하는 함수를 활용하여
외부 입력값에 의해 SQL 질의문의 구조가 변경되지 않도록 한다.
3. 외부 입력값을 이용해 동적으로
SQL질의문을 생성해야 하는 경우,
입력값에 대한 검증을 수행한 뒤 사용해야 한다.
- 클라이언트와 서버 양측에서
입력값에 대해 안전한 값만 사용될 수 있도록
검증작업을 수행한다.
[검증 방법]
1. 필터를 이용한 입력값 검증
- 외부입력값에서 SQL삽입이 가능한 문자열들을 필터링하여
안전한 값으로 치환하도록 하는 Filter 컴포넌트를 생성하고,
DB에서 관리하는 데이터를 처리하는 모든 애플리케이션에 일괄 적용한다.
2. 인터셉트를 이용한 입력값 검증
- MVC프레임워크를 사용하는 경우
Interceptor 컴포넌트를 사용하여
입력값에 대한 검증 작업을 수행한 뒤
요청을 차단하거나 허용하는 정책을
애플리케이션에 일괄 적용 한다.
3. 라이브러리 또는 Validator 컴포넌트를 이용한 입력값 검증
- 입력값을 검증하는 Validator 컴포넌트를 공통코드로 생성하고,
모든 개발자가 SQL질의문에 삽입되는 입력값에 대해
검증작업을 해당 컴포넌트에서 수행하도록 시큐어코딩 규칙을 정의한다.
ORM(Oject-Relational-Mapping) 프레임워크
객체지향 프로그래밍의 객체와
관계형 데이터베이스의 테이블(스키마)을
연결하는 프레임워크입니다.
객체지향 프로그래밍은 클래스를 사용하고
관계형 데이터 베이스는 테이블을 사용합니다.
여기서 객체 모델과 관계형 모델간에 불일치가 발생하게 되는데,
ORM은 객체간의 관계를 바탕으로
SQL을 자동으로 생성하여 불일치를 해결합니다.
ORM 종류
개발 언어 별로
다양한 프레임워크가 존재합니다.
[JAVA]
- JPA, Hibernate, EclipseLink, DataNucleus, Ebean 등
[C++]
- ODB, QxOrm 등
[Python]
- Django, SQLAlchemy, Storm 등
[iOS]
- DatabaseObjects, Core Data 등
[.NET]
- NHibernate, DatabaseObject, Dapper 등 PHP : Doctrine, Propel, RedBean 등
진단 기준 및 방법
요구사항 1
애플리케이션에서 DB연결을 수행할 때
최소권한의 계정을 사용해야 한다.
- 애플리케이션에서 사용할 계정이
최소권한을 가지도록 명시하고 있는지,
- 진단 시점에 개발서버가 구축되고
개발서버에서 사용할 DB가 생성되어 있는 경우에는
실제 DB 접속 계정의 권한을 확인한다.
[ 진단 방법 ]
1. 애플리케이션별 DB접속 계정이 할당되고,
각 계정의 권한이 최소권한으로 설정되어 있는가?
1-1 요구사항정의서에 설계항목에 대한 대책이 수립되어 있으며,
아키텍처 설계서에 설계항목 적용계획이 수립되어 있고,
요구사항추적표로 요구 사항 추적 가능 여부 확인
- 산출물 검토 예시: 요구사항정의서, 요구사항추적표, 아키텍처설계서 검토
1-2 애플리케이션별 DB연결 계정할당과
해당계정에 대한 최소 권한 할당 여부 확인
- 산출물 검토 예시: 아키텍처설계서, 초기데이터설계서 검토
2. 설정된 사용자 권한 외의 요청에 대해
차단되는지에 대한 테스트 계획이 수립되어 있는가?
2-1 DB연결 계정의 권한 외의 요청이
차단되는지를 점검할 수 있는
테스트 계획 수립이 수립되어 있는지 확인
- 산출물 검토 예시: 단위테스트케이스 검토
관련 산출물
- 요구사항정의서, 요구사항추적표, 아키텍처 설계서, 초기데이터 설계서, 개발가이드, 단위테스트 케이스, 단위테스트 시나리오 등
요구사항 2
외부입력값이 삽입되는 SQL문을
동적으로 생성해서 실행하지 않도록 해야 한다.
- 사용하는 플랫폼(JAVA, ASP.Net 등) 및 프레임워크에 맞는
정적 SQL을 작성하도록 명시하고 있는지 확인한다.
[ 진단 방법 ]
1. DB 데이터 처리기능 구현시,
외부 입력값이 쿼리의 구조에 영향을 미치지 않도록
보안설계가 적용 되어 있는가?
1-1 요구사항정의서에 설계항목에 대한 대책이 수립되어 있으며,
아키텍처 설계서에 설계항목 적용계획이 수립되어 있고,
요구사항추적표로 요구 사항 추적 가능 여부 확인
- 산출물 검토 예시: 요구사항정의서, 요구사항추적표, 아키텍처설계서 검토
1-2 안전한 쿼리 실행환경을 제공할 수 있는
ORM 프레임워크와 같은 프레임 워크 사용여부확인
- 산출물 검토 예시: 아키텍처설계서의 보안요구항목 적용 계획을 검토
1-3 개발가이드로 안전한 정적 쿼리 코딩 방법을 정의하고 있는 지 확인
- ibatis, mybatis 사용시 #{변수} 사용 정의
- PreparedStatement와 같은 정적쿼리를 수행하는 API 사용정의
- 산출물 검토 예시: 개발가이드 검토
2. 입력값이 DB 쿼리의 구조를 변경시키는지 점검하기 위한
테스트 계획이 수립되어 있는가?
2-1 쿼리문의 구조를 변경할 수 있는 입력값이
쿼리 구조 변경에 영향을 주는지 점검할 수 있는
테스트 계획이 수립되어 있는지 확인
[테스트 입력값]
- 특수문자: ‘ , “ , = , & , | , ! , ( , ) , { , } , $ , % , @ 등
- 예약어: UNION, SELECT, THEN, IF, INSTANCE, END, COLUMN 등
- 함수 명: DATABASE(), CONCAT(), COUNT(), LOWER() 등
- 산출물 검토 예시: 단위테스트케이스 검토
관련 산출물
- 요구사항정의서, 요구사항추적표, 아키텍처설계서, 개발가이드, 단위테스트 케이스, 단위테스트 시나리오 등
요구사항 3
외부입력값을 이용해 동적으로 SQL쿼리문을 생성해야 하는 경우,
입력값에 대한 검증을 수행한 뒤 사용해야 한다.
- 불가피하게 동적으로 쿼리문을 생성하고
외부입력값을 사용해야 하는 경우
개발자가 입력값 검증을 구현할 수 있도록
세부사항을 명시하고 있는지 확인한다.
[ 진단 방법 ]
1. 외부 입력값을 이용한 동적 쿼리를 수행하는 기능 구현시,
입력값을 필터링하는 기능이 구현되어 있는가?
1-1 요구사항정의서에 설계항목에 대한 대책이 수립되어 있으며,
아키텍처 설계서에 설계항목 적용계획이 수립되어 있고,
요구사항추적표로 요구 사항 추적 가능 여부 확인
- 산출물 검토 예시: 요구사항정의서, 요구사항추적표, 아키텍처설계서 검토
1-2 SQL필터링 기능이 설계되어 있거나
외부라이브러리를 사용하는지 확인
- 산출물 검토 예시: 프로그램명세서, 클래스설계서에서 필터링기능 검토, 외부라이브러리 사용 진단을 위해 아키텍처설계서 검토
1-3 SQL필터링 적용방법이 공통 적용으로 정의되어 있는 경우,
DB 접근을 수행하는 모든 기능에 적용되도록 설계되어 있는지 확인
- 산출물 검토 예시: 아키텍처설계서의 보안요구항목 적용 계획을 검토
1-4 각각의 기능에서 SQL필터링을 적용하는 경우
SQL필터링을 적용하기 위한 코딩규칙이
개발가이드에 정의되어 있는지 확인
- 산출물 검토 예시: 개발가이드의 코딩 규칙 검토
2. 입력값이 DB 쿼리의 구조를 변경시키는지 점검하기 위한
테스트 계획이 수립되어 있는가?
2-1 쿼리문의 구조를 변경할 수 있는 입력값이
쿼리 구조 변경에 영향을 주는지 점검할 수 있는
테스트 계획이 수립되어 있는지 확인
[테스트 입력값]
- 특수문자: ‘ , “ , = , & , | , ! , ( , ) , { , } , $ , % , @ 등
- 예약어: UNION, SELECT, THEN, IF, INSTANCE, END, COLUMN 등
- 함수 명: DATABASE(), CONCAT(), COUNT(), LOWER() 등
- 산출물 검토 예시: 단위테스트케이스 검토
관련 산출물
- 요구사항정의서, 요구사항추적표, 아키텍처설계서, 프로그램명세서, 클래스설계서, 개발가이드, 단위 테스트케이스, 단위테스트시나리오 등