IgnatiusHeo
설계단계 보안설계기준-세션통제 본문
작성일: 230630
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(171~177p)
유형 | 세션통제 |
설계항목 | 세션통제 |
설명 | 다른 세션간 데이터 공유금지, 세션ID 노출금지, (재)로그인 시 세션ID 변경, 세션종료(비활성화, 유효기간 등) 처리 등 세션을 안전하게 관리할 수 있는 방안을 설계해야 한다. |
보안대책 | ① 세션 간 데이터가 공유되지 않도록 설계해야 한다. ② 세션이 안전하게 관리되도록 해야 한다. ③ 세션ID가 안전하게 관리되도록 해야 한다. |
연관된 구현단계 |
- 잘못된 세션에 의한 데이터 정보 노출 https://cryptocurrencyclub.tistory.com/154 |
가. 취약점 개요
ㅇ 위 내용을 볼 때, 예상 가능한 보안 위협: 1. 세션 내 중요정보 노출?
- 불충분한 세션관리: 인증시 일정한 규칙이 존재하는 세션ID가 발급되거나 세션 타임아웃을 너무 길게 설정한 경우 공격자에 의해 사용자 권한이 도용될 수 있는 취약점이다.
- 잘못된 세션에 의한 정보노출: 다중 스레드 환경에서는 싱글톤(Singleton) 객체 필드에 경쟁조건(Race Condition)이 발생할 수 있다. 따라서, 다중 스레드 환경인 java의 서블릿(servlet) 등에서는 정보를 저장하는 멤버변수가 포함되지 않도록 하여, 서로 다른 세션 간 데이터를 공유하지 않도록 해야 한다.
나. 설계시 고려사항
① 세션 간 데이터가 공유되지 않도록 설계해야 한다.
ㅇ 스레드로 동작하는 웹애플리케이션의 컨트롤러 컴포넌트나, 싱글톤 객체로 생성되는 서비스 컴포넌트를 설계하는 경우 클래스 멤버 변수나 클래스변수는 세션 간에 공유되는 데이터가 되므로 클래스 설계시 읽고 쓰기가 가능한 변수를 사용하지 않도록 설계해야 한다.
② 세션이 안전하게 관리되도록 해야 한다.
ㅇ 시스템 내 모든 페이지에서 로그아웃이 가능하도록 UI를 설계하고, 로그아웃을 요청하면 사용자에게 할당된 세션을 완전히 제거하는 API를 사용하도록 시큐어코딩 규칙을 정의한다.(ex.Java는 session.invalidate())
ㅇ 세션 타임아웃 시간은 중요기능의 경우 2~5분, 위험도가 낮은 애플리케이션의 경우 15~30분으로 설정하고, 이전 세션이 종료되지 않은 상태에서 새로운 세션이 생성되지 않도록 한다.
ㅇ 웹 브라우저 종료로 인한 세션 종료는 서버 측에서 인지할 수 없으므로, 일정 시간 동안 사용되지 않는 세션 정보는 강제 삭제되도록 설계한다.
ㅇ 중복 로그인을 허용하지 않는 경우, 새로운 로그인 세션 생성 시 이전에 생성된 로그인 세션을 종료하거나 새로운 세션이 연결되지 않도록 검증하는 정책이 설계단계에 고려되어야 한다.
ㅇ 세션ID가 포함된 쿠키에 대해 HttpOnly 속성을 설정하여 자바스크립트로 조회할 수 없도록 만들어 XSS 공격에 대응하도록 설계한다.
ㅇ 사용자가 비밀번호를 변경하는 경우 현재 활성화된 세션을 삭제하고 다시 할당한다.
③ 세션ID가 안전하게 관리되도록 해야 한다.
ㅇ 세션ID 생성
- 세션ID는 안전한 서버에서 생성해서 사용되어야 한다.
- 세션ID는 최소 128비트의 길이로 생성되어야 하며, 안전한 난수 알고리즘을 적용하여 예측이 불가능한 값이 사용되어야 한다.
ㅇ 세션ID 사용
- URL Rewrite 기능을 사용하는 경우 세션ID가 URL에 노출될 수 있으므로, 사용하지 않도록 설계한다.
ㅇ 세션ID 폐기
- 로그인 성공시 로그인 전에 할당받은 세션ID는 파기하고 새로운 값으로 재할당하여 세션ID 고정공격에 대응하도록 시큐어코딩 규칙을 정의한다.
- 장기간 접속되어 있는 세션은 세션ID 노출위험이 크므로, 일정시간 주기적으로 세션ID를 재할당하도록 설계한다.
다. 진단 세부사항
① 세션 간 데이터가 공유되지 않도록 설계해야 한다. 세션 간 데이터 공유로 인한 정보노출이나 오류가 발생하지 않도록 설계되어 있는지 확인한다.
ㅇ 스레드로 동작되는 클래스 설계 시 읽기/쓰기가 가능한 스레드 간 공유데이터의 설계 여부 확인
- Servlet, Controller의 경우 클래스 멤버변수, 클래스 변수 선언
- JSP의 경우 선언부에 변수 선언
② 세션이 안전하게 관리되도록 해야 한다. 세션 생성과 종료, 타임아웃 시간설정 등 안전한 세션 관리방안의 설계 여부를 확인한다.
ㅇ 로그인에 성공 시 세션 재할당 코딩규칙 정의 여부 확인
ㅇ 로그아웃 시 할당된 세션 완전 제거 코딩규칙 정의 여부 확인
ㅇ 사용자의 일방적인 연결종료에 대해 할당된 세션이 제거되도록 프로그램의 설계 여부 확인
ㅇ 오랫동안 사용하지 않는 세션에 대해 타임아웃을 설정하여 할당된 세션이 제거되도록 설계되어 있는지 확인
- 중요기능은 2~5분, 위험도가 낮은 경우 15~30분
ㅇ 비밀번호 변경 시 재 인증을 수행하여 새로운 세션이 할당되도록 설계되어 있는지 확인
③ 세션ID가 안전하게 관리되도록 해야 한다. 세션ID가 안전하게 관리될 수 있도록 설계되어 있는지 확인한다.
ㅇ 세션ID 생성을 서버에서 생성하도록 웹서버 환경설정 계획이 수립되어 있는지 확인
ㅇ 세션ID 전송 방법을 쿠키로 제한하며 쿠키의 속성에 HttpOnly가 설정되도록 웹서버 환경설정 계획이 수립되어 있는지 확인
ㅇ 장시간 접속되어 있는 경우 일정 시간 주기적으로 세션ID가 재할당하도록 웹서버 환경설정 계획이 수립되어 있는지 확인 ㅇ 로그인 수행 전에 할당받은 세션ID는 로그인 성공 후 재할당하도록 코딩규칙이 정의되어 있는지 확인
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
구현단계 보안약점 제거 기준-코드 삽입 (0) | 2023.07.03 |
---|---|
구현단계 보안약점 제거 기준-SQL 삽입 (0) | 2023.07.03 |
설계단계 보안설계기준-예외처리 (0) | 2023.06.30 |
설계단계 보안설계기준-중요정보 전송 (0) | 2023.06.30 |
설계단계 보안설계기준-중요정보 저장 (0) | 2023.06.30 |