IgnatiusHeo

설계단계 보안설계기준-DBMS 조회 및 결과 검증 본문

자격/SW보안약점진단원

설계단계 보안설계기준-DBMS 조회 및 결과 검증

Ignatius Heo 2023. 6. 20. 23:44

작성일: 230620

 

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

 

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

 

구분  입력데이터 검증 및 표현
설계항목  DBMS 조회 및 결과 검증
설명
 DBMS 조회 시 질의문(SQL) 내 입력값과 그 조회결과에 대한 유효성 검증방법(필터링 등) 설계 및 유효하지 않은 값에 대한 처리 방법을 설계해야 한다

보안대책
 ① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.

 ② 외부입력값이 삽입되는 SQL질의문을 동적으로 생성해서 실행하지 않도록 해야 한다.

 ③ 외부 입력값을 이용해 동적으로 SQL질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용해야 한다.

연관된
구현단계
- SQL 삽입
https://cryptocurrencyclub.tistory.com/110

 

가. 취약점 개요

 

ㅇ 위 내용을 볼 때, 예상 가능한 보안 위협: SQL Injection

  1. 데이터베이스(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질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용해야 한다.

  ㅇ 클라이언트와 서버 양측에서 입력값에 대해 안전한 값만 사용될 수 있도록 검증작업을 수행한다.

DBMS 설계 시 고려사항(출처: 소프트웨어 보안약점 진단 가이드 2021, 행정안전부·KISA)

  1. 필터를 이용한 입력값 검증: 외부입력값에서 SQL 삽입이 가능한 문자열들을 필터링하여 안전한 값으로 치환하는 Filter 컴포넌트를 생성하고, DB에서 관리하는 데이터를 처리하는 모든 애플리케이션에 일괄 적용한다.
  2. 인터셉트를 이용한 입력값 검증: MVC 프레임워크를 사용하는 경우 Interceptor 컴포넌트를 사용하여 입력값에 대한 검증 작업을 수행한 뒤 요청을 차단하거나 허용하는 정책을 애플리케이션에 일괄 적용한다.
  3. 라이브러리 또는 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접근을 수행하는 모든 기능에 적용되어 있는지 확인

  ㅇ  쿼리 구조를 변경할 수 있는 입력값의 쿼리 구조 변경 가능성 테스트

 

 

끝.