IgnatiusHeo
설계단계 보안설계기준-DBMS 조회 및 결과 검증 본문
작성일: 230620
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(43~49p)
구분 | 입력데이터 검증 및 표현 |
설계항목 | DBMS 조회 및 결과 검증 |
설명 | DBMS 조회 시 질의문(SQL) 내 입력값과 그 조회결과에 대한 유효성 검증방법(필터링 등) 설계 및 유효하지 않은 값에 대한 처리 방법을 설계해야 한다 |
보안대책 | ① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다. ② 외부입력값이 삽입되는 SQL질의문을 동적으로 생성해서 실행하지 않도록 해야 한다. ③ 외부 입력값을 이용해 동적으로 SQL질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용해야 한다. |
연관된 구현단계 |
- SQL 삽입 https://cryptocurrencyclub.tistory.com/110 |
가. 취약점 개요
ㅇ 위 내용을 볼 때, 예상 가능한 보안 위협: SQL Injection
- 데이터베이스(DB)와 연동된 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력데이터에 SQL 질의문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있다.
나. 설계시 고려사항
① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.
ㅇ 회원가입, 로그인, ID/PW찾기, 검색, 기타 DB에 접근을 해야 하는 애플리케이션 기능 실행 시, 해당 기능에 연결된 DB 연결 계정은 기능 관련 테이블의 데이터에 한해서만 SIUD(Select, Insert, Update, Delete) 권한을 설정해야 함.
→ 안 그럴 경우? 타 테이블, 민감정보에 접근하거나 데이터 제거 등 여러 보안 위협 발생 가능
② 외부 입력값이 삽입되는 SQL 질의문을 동적으로 생성해서 실행하지 않도록 해야 한다.
ㅇ SQL 질의문의 구조가 외부 입력값에 의해 변경되지 않는 API를 사용하도록 시큐어코딩 규칙을 지정한다.
ㅇ ORM 프레임워크를 사용하여 안전한 정적쿼리구조로 SQL문을 수행할 수 있도록 개발환경을 설정하고, 제공하는 함수를 활용하여 외부 입력값에 의해 SQL질의문의 구조가 변경되지 않도록 한다.
무슨말임????????
→ ORM (Object-Relational-Mapping, 객체 관계 매핑): 객체의 클래스와 RDB의 테이블을 매핑
→ 쿼리를 안쓰고도 OOP 객체를 이용해 데이터에 접근하는 걸로 보임.
→ 요지는 의도하지 않은 쿼리 구조 변경으로 인한 위협을 사전에 차단하기 위해 ORM 프레임워크를 써라 이말인듯.
③ 외부 입력값을 이용해 동적으로 SQL질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용해야 한다.
ㅇ 클라이언트와 서버 양측에서 입력값에 대해 안전한 값만 사용될 수 있도록 검증작업을 수행한다.
- 필터를 이용한 입력값 검증: 외부입력값에서 SQL 삽입이 가능한 문자열들을 필터링하여 안전한 값으로 치환하는 Filter 컴포넌트를 생성하고, DB에서 관리하는 데이터를 처리하는 모든 애플리케이션에 일괄 적용한다.
- 인터셉트를 이용한 입력값 검증: MVC 프레임워크를 사용하는 경우 Interceptor 컴포넌트를 사용하여 입력값에 대한 검증 작업을 수행한 뒤 요청을 차단하거나 허용하는 정책을 애플리케이션에 일괄 적용한다.
- 라이브러리 또는 Validator 컴포넌트를 이용한 입력값 검증: 입력값을 검증하는 Validator 컴포넌트를 공통코드로 생성하고, 모든 개발자가 SQL 질의문에 삽입되는 입력값에 대해 검증작업을 해당 컴포넌트에서 수행하도록 시큐어코딩 규칙을 정의한다. SQL문을 안전하게 처리할 수 있도록 Hibernate, MyBatis, JPA, AntiSQLi, MeekroDB, HTMLPurifier 사용을 고려할 수 있다.
→ 이미지처럼 DB 접근 루트 별 컴포넌트를 배치하여 안전하지 않은 값은 차단하도록 설계하라는 말로 보임.
다. 진단 세부사항
① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.
ㅇ 애플리케이션 별 DB연결 계정 할당 확인 후 해당 계정의 최소 권한 할당 여부 확인 및 점검 테스트
② 외부입력값이 삽입되는 SQL질의문을 동적으로 생성해서 실행하지 않도록 해야 한다.
ㅇ 안전한 쿼리 실행환경을 제공할 수 있는 프레임워크 사용 여부 확인, 정적 쿼리 사용 여부 확인
→ #{variable}로 변수 바인딩하거나 PreparedStatement로 정적쿼리 사용하는지 확인
ㅇ 쿼리 구조를 변경할 수 있는 입력값의 쿼리 구조 변경 가능성 테스트
→ 특수문자: ' " = & | ! ( ) { } $ % @ (# ^ * _ 빼고 키패드에 있는거 다)
→ 예약어: UNION, SELECT, THEN, IF, INSTANCE, END, COLUMN
→ 함수: DATABASE(), CONCAT(), COUNT(), LOWER()
③ 외부 입력값을 이용해 동적으로 SQL질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용해야 한다.
ㅇ SQL 필터링 기능의 설계, 외부 라이브러리 사용 여부 확인
ㅇ SQL 필터링 적용 방법이 공통인 경우 DB접근을 수행하는 모든 기능에 적용되어 있는지 확인
ㅇ 쿼리 구조를 변경할 수 있는 입력값의 쿼리 구조 변경 가능성 테스트
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
설계단계 보안설계기준-웹 서비스 요청 및 결과 검증 (0) | 2023.06.23 |
---|---|
설계단계 보안설계기준-시스템 자원 접근 및 명령어 수행 입력값 검증 (0) | 2023.06.23 |
설계단계 보안설계기준-디렉토리 서비스 조회 및 결과 검증 (0) | 2023.06.22 |
설계단계 보안설계기준-XML 조회 및 결과 검증 (0) | 2023.06.22 |
23년도 SW보안약점 진단원 이수시험 스터디 시작 (0) | 2023.06.19 |