2021 OWASP 10대 취약점

minjeong·2023년 5월 23일
0

웹 애플리케이션을 개발할 때 보안성을 높이기 위해 참고할 수 있는 기준과 대응 방법에 대해 요약합니다.


OWASP 10대 취약점

  • The Open Web Application Security Project
  • 웹에 관한 정보 노출, 악성 파일 및 스크립트, 보안 취약점 등을 연구한다.
  • OWASP TOP 10
    • 가장 빈도가 높고 보안상 영향을 크게 줄 수 있는 10대 웹 애플리케이션 취약점 목록.
    • 2004년에 처음 발표되었고, 가장 마지막은 2021년이다.
    • 2017년도 버전에서 순서가 변동되고 3가지 항목이 새롭게 구성되었다.
      https://owasp.org/www-project-top-ten/

2021 10대 취약점

출처: https://owasp.org/www-project-top-ten/
출처: https://www.appsealing.com/kr/2022-owasp-10대-취약점/

1. 손상된 액세스 제어, Broken Access Control

5위에서 1위로 치고 올라왔고, 웹사이트의 94%가 평균 3.81% 발생 중인 최대 화두의 취약점.

취약점 설명

  • 특정 기능, 특정 역할에게만 액세스 권한을 부여해야 하는 기본적인 원칙을 위반하는 사례.
  • POST, PUT, DELETE에 대한 액세스 제어가 누락된 API를 제공하는 사례.
  • 로그인하지 않고 사용자처럼, 사용자로 로그인하고 관리자처럼 접근하고 사용할 수 있게 되는 권한 상승 오류를 발생시키는 사례.
  • CORS 구성 오류로 인해 승인되지 않은/신뢰할 수 없는 출처의 API 액세스를 허용시키는 사례.

예방법

  • 공용 리소스를 제외하고는 기본적으로 거부하도록 한다.
  • 사용자에게 모든 테이블의 CRUD 권한을 주지 않고 특정 레코드에만 CRUD 권한을 부여한다.
  • 상태 저장 섹션 식별자는 로그아웃 후 서버에서 무효화되게 해야 한다. / Stateless JWT 토큰은 공격자의 기회를 최소화시킬 수 있게 수명이 짧아야 한다. / 수명이 긴 JWT의 경우 OAuth 표준을 따라 액세스를 취소시키는 것이 좋다.
  • CORS 사용을 최소화한다.

2. 암호화 실패, Cyptographic Failures

암호화 부족 또는 실패는 민감한 데이터를 노출시키는 문제를 야기시키므로 2위로 상승한 취약점.

취약점 설명

  • 비밀번호, 신용 카드 번호, 건강 기록, 개인 정보 등의 개인 정보 보호법 관리 대상으로 해당하는 데이터를 일반 텍스트로 전송한다.
  • 오래되었거나 취약점이 발견된 암호화 알고리즘, 프로토콜을 사용한다.

예방법

  • 개인 정보 보호법과 비지니스 요구 사항 등에 따라 데이터를 식별한 후 민감한 정보는 암호화하여 처리, 저장한다.
  • 최신의 표준 암호화 알고리즘, 프로토콜을 사용한다. (MD5, SHA1과 같이 더이상 사용되지 않는 암호화 기능을 피해야 한다.)
  • 민감한 데이터를 포함한 응답은 캐싱을 비활성화하여 보낸다.
  • 민감한 데이터를 전송할 땐 FTP, SMTP 같은 레거시 프로토콜을 사용하지 않는다.

3. Injection

웹 애플리케이션의 94%가 최대 발생률 19%, 평균 발생률 3% 발생하는 취약점.

취약점 설명

  • 임의의 SQL 문을 주입, 실행시켜 데이터베이스가 비정상적인 동작을 하도록 조작한다.

    -- 가장 대표적인 사례 --
    
    SELECT * FROM Users WHERE id = `INPUT_ID` AND password = `INPUT_PASSWORD`;
    ↓
    ↓ INPUT_ID === " ` OR 1=1 --"SELECT * FROM Users WHERE id = ` ` OR 1=1 --`AND password = `INPUT_PASSWORD`;
    ↓
    ↓ OR문과 주석 처리 후 결과
    ↓
    SELECT * FROM Users;

예방법

  • 서버측에서 입력 유효성 검사를 사용한다. (완벽한 방어 수단은 아니다.)
    • SQL 명령어가 포함된 문자열은 유효하지 않다고 판단하는 등.
  • 쿼리 내에서 LIMIT, 기타 SQL 컨트롤을 사용하여 대량의 레코드가 삽입되거나 공개되지 않도록 설정한다.
  • 저장 프로시저를 사용한다. = 사용하고자 하는 Query에 미리 형식을 지정하여, 형식이 맞지 않으면 Query가 실행되지 않기 땝문에 보안성을 향상시킨다고 한다.

4. 안전하지 않은 설계, Insecure Design

(설계 결함과 구현 결함을 구분한다. 원인과 해결 방법이 다르다.)

취약점 설명

  • 특정 공격을 방어하기 위해 필요한 보안 제어를 생성하지 않은 경우, 구현을 완벽하게 한다고 해도 결함이 발생한다.
  • 데이터 무결성, 기밀성, 가용성, 신뢰성 고려한 비지니스 로직 설계를 하지 않는다.
  • 보안 소프트웨어 설계—보안 개발 수명 주기, 보안 설계 패턴, 보안 컴포넌트 라이브러리 및 모델링 등을 하지 않는다.

예방법

  • AppSec 전문가와 보안 개발 수명 주기를 설정한다?
  • 보안 설계 패턴의 라이브러리를 사용하도록 한다?
  • 액세스 제어, 보안 인증, 비지니스 로직을 모델링한다.

5. 보안 구성 오류, Security Misconfiguration

취약점 설명

  • 오류 처리 시 사용자가 추적할 수 있는, 지나치게 유익한 오류 메시지를 표시한다.
  • 불필요한 기능이 활성화되어 있거나 설치되어 있다.

예방법

  • 불필요한 기능, 구성 요소, 문서, 샘플 파일 등이 없는 최소한의 플랫폼으로 구성한다.
  • 개발, QA, 프로덕션의 보안 환경을 동일하게 구성한 채 관리하며 배포하는 시스템을 구축한다.

6. 취약하고 오래된 구성요소, Vulnerable and Outdated Components

사용 중인 플랫폼, 프레임워크, 라이브러리가 업데이트, 패치되었는데 이를 수정하거나 업그레이드하지 않은 채 계속 사용할 경우 보안 상 위험할 수 있다.

예방법

  • 정기적으로 사용중인 구성요소의 취약성을 스캔하고, 패칭과 업데이트를 관리한다.
    • 정기적으로 구성요소를 패칭할 수 있는 업무 흐름을 자동화하여 관리한다.
  • 업데이트, 업그레이드, 패치된 구성요소의 호환성을 테스트한 후 적용한다.

7. 식별 및 인증 실패, Identification and Authentication Failures

취약점 설명

  • 자동화된 무차별 공격을 허용한다.
  • password나 admin 같은 기본 암호, 잘 알려진 암호 등을 허용한다.
  • URL에 세션 식별자를 노출한다.
  • 세션 식별자나 토큰을 올바르게 무효화하지 못해, 사용자가 로그아웃 후에도 세션 값이나 인증 토큰이 유효하게 동작한다.

예방법

  • 다단계 인증을 구현한다.
  • 상위 10,000개 최악의 암호 목록 등으로 취약한 암호 검사를 구현한다.
  • 로그인 실패 횟수를 카운트하여 제한한다.
  • 무차별 공격, 기타 공격, Credential Stuffing(빼내온 어느 서비스의 ID/PW로 모든 사이트에 로그인 시도) 등을 감지하면 로그인 실패 기록을 관리하고 관리자에게 알리는 대응을 하도록 한다.
  • 세션 식별자는 URL에 포함시키지 않는다.
  • 사용자가 로그아웃하거나 유휴 시간을 초과할 경우 무조건 세션이나 발급한 인증 토큰을 무효화하도록 한다.

8. 소프트웨어 및 데이터 무결성 실패, Software and Data Integrity Failures

취약점 설명

  • 신뢰할 수 없는 소스 코드, 리포지토리, CDN의 플러그인·라이브러리·모듈 등을 사용한다.
  • 안전하지 않은 CI/CD 파이프라인을 사용한다. → 무단 액세스, 악성 코드 주입, 시스템 손상 등의 가능성이 있다.
  • 자동 업데이트를 활성화해두어서 구성 요소가 무결성 검사 없이 설치되고 업로드 된다.

예방법

  • npm, maven과 같은 라이브러리, 종속성 관리 툴에 의해 신뢰 가능한 리포지토리로 호스팅 된 플러그인·라이브러리·모듈 등인지 확인하고 사용한다.
  • 악성 코드 및 구성 요소가 소프트웨어 파이프라인에 도입될 가능성을 최소화하기 위해, 코드 및 구성 변경에 대한 검토 프로세스를 구축한다.
  • 빌드, 배포 프로세스 상의 코드 무결성을 보장하기 위해 CI/CD 파이프라인의 액세서 제어 등을 확인한다.
  • 디지털 서명과 같은 메커니즘을 사용하여 소프트웨어와 데이터의 변경, 변조, 재생을 감지하며 어떤 형태의 무결성 검사나 디지털 서명이 없으면 신뢰할 수 없는 클라이언트에게 전송하지 않도록 처리한다.

9. 보안 로깅 및 모니터링 실패, Security Logging and Monitoring Failures

로깅, 모니터링 없이는 보안 침해를 감지할 수 없다.

취약점 설명

  • 로그인 시도 및 실패, 중요 데이터 및 권한과 관련된 트랜잭션 로그를 쌓지 않는다.
  • 적절한 임계값, 응답 *에스컬레이션* 프로세스가 없거나 있어도 효과적이지 않다.
  • 의심스러운 활동으로 판별하는 기준을 세우지 않고, 모니터링도 하지 않는다.

예방법

  • 로깅 및 모니터링 시스템을 구축하고 액세스 제어 및 이상 활동 감지를 위해 기록한다.
  • 의심스러운 로그 발생 시 모니터링 및 경고 알림을 설정하여 대응할 수 있도록 한다.
    • 응용프로그램 보호 프레임워크를 사용하여 로그를 대시보드로 확인하고 알림 기능을 사용할 수 있다.
  • 사고 대응 및 복구 계획을 수립해둔다.

10. 서버사이드 요청 위조, erver-Side Request Forgery

사용자 제공 URL의 유효성을 검사하지 않고 원격 리소스를 가져올 때 발생한다. (클라이언트가 서버에게 원격 경로의 특정 파일을 URL로 접근했는데 아무 보안 처리를 해두지 않아서 열람이나 다운로드가 가능한 경우를 말하는 것 같다.)

예방법

  • 클라이언트에게 raw response 보내지 않는다.
  • HTTP 리디렉션을 비활성화한다.
  • URL Scheme, port, destination의 허용 목록을 설정하고 관리한다.

요약

취약점예방법
1. 손상된 액세스 제어- API 액세스 관리 미흡- CORS 사용 최소화
- JWT 관리
2. 암호화 실패- 민감한 정보 Plane Text로 관리- 민감한 정보 암호화하여 처리, 저장
- 취약한 알고리즘, 프로토콜 사용- 표준 알고리즘 사용, 레거시 프로토콜 X
3. (SQL) Injection- 임의의 SQL문 주입해도 동작- 서버에서 입력값 유효성 검사
- 저장 프로시저 사용
4. 안전하지 않은 설계- 데이터 무결성, 기밀성, 신뢰성 있게 비지니스 로직 설계 X- 보안 소프트웨어 방법론 적용하여 설계
- 보안 설계 미흡- 액세스 제어, 보안 인증, 비지니스 로직 모델링
5. 보안 구성 오류- 사용자 오류 처리 미흡- 서버 정보 노출 최소화
- 불필요한 코드, 파일 잔존- 개발/QA/상용 보안 환경 구성, 관리, 배포하는 시스템 구축
6. 취약하고 오래된 구성 요소- 사용하는 구성 요소의 패치, 업데이트 버전 적용, 관리 X- 정기적인 구성요소 취약점 스캔, 패칭 작업을 수행하고 자동화하여 관리
7. 식별 및 인증 실패- 자동화된 로그인 시도를 허용- 무차별, 자동화 로그인 실패 로그 기록
- 취약한 암호를 허용- 취약한 암호 검사 구현(계정 생성 방해)
- URL에 세션 식별자, 인증 토큰 노출- 세션 식별자, 인증 토큰 URL 노출 X
- 로그아웃 후에도 세션 및 토큰 유효- 로그아웃/유휴 시간 초과 시 인증 무효화
8. 소프트웨어 및 데이터 무결성 실패- 무결성 검사, 디지털 서명 미흡- 디지털 서명 구현
- 무결성 검사, 디지털 서명 미흡- 디지털 서명 구현
- 신뢰할 수 없는 구성요소 사용- 신뢰 가능한 리포지토리 확인 후 구성 요소 업데이트 및 사용
- 안전하지 않은 CI/CD 사용- CI/CD 파이프라인에 접근 제어 설정
- 자동 업데이트 활성화 환경
9. 보안 기록 및 모니터링 실패- 액세스 및 트랜잭션 로그 관리 부재- 로깅 및 모니터링 시스템 구축
- 응답 에스컬레이션 프로세스 미흡- 모니터링 및 경고 알림으로 개발자 대응
- 모니터링 및 알림 기능 부재- 사고 대응 및 복구 계획 수립
10. 서버사이드 요청 위조- 서버의 원격 리소스를 URL 접근 허용- raw response 비허용
- URL scheme, port , destination의 허용 목록 설정, 관리
profile
신입 개발자 👩‍💻

0개의 댓글