OWASP
웹 애플리케이션은 현대 비즈니스와 개인 활동의 핵심입니다. 그러나 웹 애플리케이션은 사이버 공격자들에게 매력적인 공격 표적이 되어 있으며, 이로 인해 웹 애플리케이션 보안은 매우 중요한 주제가 되었습니다. OWASP (Open Web Application Security Project)는 웹 애플리케이션 보안 커뮤니티에서 가장 중요한 자원 중 하나로, 매년 'OWASP Top 10'이라고 하는 보안 위협 목록을 발표합니다. 이 목록은 웹 개발자, 보안 전문가 및 조직이 웹 애플리케이션 보안을 강화하는 데 도움이 되는 중요한 지침을 제공합니다. 이 글에서는 2023년 버전의 OWASP Top 10에 대해살펴보겠습니다.
A1: Broken Access Control (액세스 제어의 파괴)
Broken Access Control는 웹 애플리케이션 보안에서 가장 중요하고 흔한 취약점 중 하나입니다. 이 취약점은 사용자 또는 시스템이 허가되지 않은 방식으로 리소스에 액세스할 수 있는 상황을 가리킵니다. 액세스 제어는 사용자에게 필요한 기능과 리소스만을 제공하도록 하는 핵심적인 보안 원칙 중 하나이며, 이 원칙을 위반하는 것이 바로 Broken Access Control입니다. 오름세를 이어가며 2017년 5위에서 2021년에는 목록 상단을 차지한 'Broken Access Control'은 여전히 중요한, 계속되는 위협으로 남아 있습니다.
Broken Access Control이 발생하는 이유
- 구성 오류, IDOR (Insecure Direct Object References)로 발생할 수 있는데, 이는 응용 프로그램이 파일 또는 데이터베이스 레코드와 같은 리소스에 직접적인 참조를 노출시키는 경우입니다.
- 보안되지 않은 세션 관리로 인해 세션 관리에서의 결함으로 공격자가 사용자 세션을 탈취할 수 있는 경우 등 여러 이유로 발생할 수 있습니다.
방어 및 예방
- '최소 권한 원칙'을 따라야 합니다. 이것은 사용자에게 자신의 작업을 수행하는 데 필요한 최소한의 권한만 부여하고 더 이상의 권한을 부여하지 않는 것을 의미합니다.
- 모든 사용자 입력은 검증되고 정리되어 악의적인 데이터 삽입을 방지해야 하며, API에 액세스 제어를 적용하고 모든 요청에 대해 권한 확인을 해야 합니다.
- 정기적인 보안 감사와 코드 검토는 액세스 제어 문제를 식별하고 수정하기 위해 필수적이며, 무단 액세스를 제한하기 위해 다중 인증을 강제해야 합니다.
A2: Cryptographic Failures (암호화 실패)
이전에는 "Sensitive Data Exposure"라는 이름으로 세 번째 위치에 있었지만, 이후에 이름이 변경되었습니다. 이전 이름은 원인이 아닌 증상을 설명했기 때문입니다. 암호화는 신용 카드 번호와 개인 식별 정보 (PII)와 같은 매우 민감한 데이터를 전송 중에 보호하는 데 사용됩니다. 그러나 이것은 약한 암호화 알고리즘이나 짧은 암호화 키와 같은 요소로 인해 실패할 수 있으며, 이로 인해 공격자가 민감한 데이터를 해독하기 쉬워질 수 있습니다.
Cryptographic Failures를 예방하는 방법
- 강력한 암호화 알고리즘 사용: 안전하고 견고한 암호화 알고리즘을 사용하여 데이터를 보호하고, 암호화 키의 길이도 충분히 길어야 합니다.
- 암호화 키 관리: 암호화 키를 안전하게 저장하고 관리하고, 키 누출을 방지하기 위한 강력한 키 관리 정책을 적용해야 합니다.
- 암호 저장 보안: 사용자 비밀번호와 같은 암호를 안전하게 저장하기 위해 안전한 해시 알고리즘과 솔트(Salt)를 사용해야 합니다.
- 전송 보안 강화: 전송 중에 데이터를 보호하기 위해 안전한 프로토콜 및 암호화를 사용하고, SSL/TLS를 업데이트하고 강화해야 합니다.
- 암호 라이브러리 사용: 암호화 기능을 구현할 때 안전하고 검증된 암호 라이브러리를 사용해야 합니다.
- 보안 테스팅: 암호화 구현의 취약점을 찾아내고 보완하기 위해 정기적인 보안 테스팅을 수행해야 합니다.
A3: Injection (삽입 공격)
2017년에는 Injection이 OWASP Top 10에서 1위를 차지하고 있었으며, Cross-Site Scripting은 7위에 랭크되었습니다. 그러나 이제 이 두 가지 보안 취약점은 하나의 통합 용어 아래에 모아져 있으며, OWASP 2023에서는 3위에 해당하는 카테고리로 통합되었습니다.
Injection 공격은 입력 유효성 검사 및 데이터 처리의 부적절한 처리에 취약점을 이용합니다. 공격자는 SQL 쿼리, 코드 스니펫 또는 명령을 웹 애플리케이션 양식 또는 URL에 주입합니다. 이를 통해 공격자는 민감한 데이터에 액세스하고 애플리케이션의 동작을 조작할 수 있습니다.
주요 예시
- SQL Injection (SQL 삽입): 데이터베이스 공격을 위해 SQL 쿼리를 주입하는 것으로, 공격자는 데이터베이스를 조작하거나 민감한 정보를 탈취할 수 있습니다.
- Cross-Site Scripting (XSS, 크로스 사이트 스크립팅): 주로 JavaScript 기반 브라우저 공격으로, 감염된 웹 페이지를 통해 세션 탈취, 쿠키 도용 또는 사용자에 대한 기타 공격을 수행합니다.
- Command Injection (명령 삽입): 공격자는 애플리케이션에서 실행되는 시스템 명령에 악성 명령을 주입하여 서버를 제어하거나 무단 작업을 수행할 수 있습니다.
- LDAP Injection (LDAP 삽입): 공격자는 인증 및 권한 부여에 사용되는 LDAP 쿼리를 조작하여 액세스 권한을 얻습니다.
- XML Injection (XML 삽입): 공격자는 XML 데이터에 악의적인 내용을 삽입하여 애플리케이션의 구문 분석 프로세스를 방해하고 액세스 권한을 얻을 수 있습니다.
- Server-Side Template Injection (SSTI, 서버 측 템플릿 삽입): 공격자는 서버 측 템플릿 엔진에 악성 데이터를 삽입하여 원격 코드 실행 등의 공격을 수행합니다.
Injection 공격을 예방하는 방법
- 입력 검증 및 정화: 사용자 입력을 철저히 검증하고, 정규 표현식을 사용하여 허용된 형식만 허용합니다.
- 매개변수화된 쿼리 사용: SQL 쿼리를 실행할 때 매개변수화된 쿼리나 준비된 문을 사용하여 SQL Injection을 방지합니다.
- 출력 인코딩: HTML, JavaScript 및 기타 출력 데이터는 적절하게 인코딩하여 XSS 공격을 예방합니다.
- 안전한 템플릿 엔진 사용: 서버 측 템플릿 엔진을 안전하게 구성하고, 신뢰할 수 없는 데이터가 템플릿에 포함되지 않도록 합니다.
- 보안 라이브러리 및 프레임워크 사용: 보안 검증이 강화된 라이브러리 및 프레임워크를 사용하여 취약점을 줄입니다.
- 정기적인 코드 검토: 보안 전문가와 함께 정기적으로 코드 검토를 수행하여 잠재적인 취약점을 식별하고 수정합니다.
- 강력한 인증 및 권한 관리: 민감한 데이터에 접근할 수 있는 사용자 권한을 엄격하게 관리하고, 다중 인증을 도입하여 보안을 강화합니다.
- 취약성 테스트 도구 사용: 정기적으로 취약성 테스트 도구를 사용하여 애플리케이션의 보안 상태를 평가하고, 문제를 발견하여 해결합니다.
A4. Insecure Design (보안이 약한 설계)
Insecure Design은 보안 요구사항을 충족하지 못하는 소프트웨어 설계를 의미합니다. 이것은 보안 기능이 부족하거나, 보안 결함이 있는 설계로 인해 발생합니다. 설계 단계에서부터 보안을 고려하지 않으면, 애플리케이션은 심각한 취약점에 노출될 수 있습니다.
Insecure Design이 발생하는 이유
- 보안 요구사항을 명확히 정의하지 않음
- 설계 단계에서 보안 검토를 수행하지 않음
- 보안 아키텍처 원칙을 무시함
- 위험 분석 및 위협 모델링을 수행하지 않음
방어 및 예방
- 보안 요구사항 정의: 프로젝트 초기에 보안 요구사항을 명확히 정의하고, 이를 설계에 반영합니다.
- 위협 모델링: 설계 단계에서 위협 모델링을 수행하여 잠재적인 보안 문제를 식별하고 대응 방안을 마련합니다.
- 보안 아키텍처 원칙 준수: 보안 아키텍처 원칙을 준수하고, 보안이 강화된 설계를 채택합니다.
- 코드 리뷰 및 보안 검토: 설계 단계에서부터 코드 리뷰 및 보안 검토를 수행하여 보안 취약점을 조기에 발견하고 수정합니다.
- 보안 교육: 개발자와 설계자가 보안 원칙을 이해하고, 이를 설계에 적용할 수 있도록 보안 교육을 제공합니다.
- 보안 테스트: 정기적으로 보안 테스트를 수행하여 설계 단계에서 발견하지 못한 보안 문제를 찾아내고 해결합니다.
A5. Security Misconfiguration (보안 구성 오류)
Security Misconfiguration은 시스템, 서버, 네트워크 또는 애플리케이션 구성에서 발생하는 보안 문제입니다. 이는 잘못된 설정, 불필요한 기능 활성화, 디폴트 설정 사용 등으로 인해 발생할 수 있습니다. 보안 구성 오류는 공격자가 시스템에 접근하거나, 데이터를 탈취하거나, 서비스를 중단시키는 등의 공격을 수행할 수 있는 기회를 제공합니다.
Security Misconfiguration이 발생하는 이유
- 잘못된 설정 또는 보안 기능 비활성화
- 불필요한 서비스 또는 기능 활성화
- 디폴트 설정 사용
- 구성 파일의 부적절한 관리
- 취약한 네트워크 구성
방어 및 예방
- 기본 설정 변경: 모든 기본 설정을 변경하고, 보안이 강화된 설정을 적용합니다.
- 불필요한 기능 비활성화: 불필요한 서비스, 기능 또는 포트를 비활성화하여 공격 표면을 줄입니다.
- 구성 관리 도구 사용: 구성 관리 도구를 사용하여 모든 설정을 일관되게 관리하고, 변경 사항을 추적합니다.
- 보안 패치 적용: 모든 시스템 및 소프트웨어에 최신 보안 패치를 적용하여 알려진 취약점을 해결합니다.
- 정기적인 구성 검토: 정기적으로 구성 설정을 검토하고, 보안 요구사항에 맞게 조정합니다.
- 보안 테스트: 정기적으로 보안 테스트를 수행하여 구성 오류를 발견하고 수정합니다.
A6. Vulnerable and Outdated Components (취약하고 업데이트 안되는 모듈 사용)
취약하거나 업데이트되지 않은 구성 요소는 웹 애플리케이션에 심각한 보안 문제를 일으킬 수 있습니다. 이러한 구성 요소는 운영 체제, 웹 서버, 데이터베이스, 애플리케이션 서버, 라이브러리 및 기타 소프트웨어 모듈을 포함합니다. 공격자는 이러한 취약점을 악용하여 시스템에 침투하고 데이터를 탈취할 수 있습니다.
Vulnerable and Outdated Components가 발생하는 이유
- 소프트웨어 업데이트 또는 패치 실패
- 취약한 라이브러리 또는 모듈 사용
- 종속성 관리 실패
- 보안 검토 미흡
방어 및 예방
- 정기적인 소프트웨어 업데이트: 모든 소프트웨어 및 구성 요소를 정기적으로 업데이트하고, 최신 보안 패치를 적용합니다.
- 취약점 관리: 취약점 관리 도구를 사용하여 구성 요소의 취약점을 지속적으로 모니터링하고, 이를 해결합니다.
- 종속성 관리: 종속성 관리 도구를 사용하여 모든 라이브러리 및 모듈의 상태를 모니터링하고, 취약한 종속성을 업데이트합니다.
- 보안 검토: 모든 구성 요소에 대해 정기적인 보안 검토를 수행하여 잠재적인 취약점을 식별하고 해결합니다.
- 사용하지 않는 구성 요소 제거: 사용하지 않는 라이브러리, 모듈 또는 기능을 제거하여 공격 표면을 줄입니다.
A7. Identification and Authentication Failures (식별 및 인증 실패)
식별 및 인증 실패는 웹 애플리케이션이 사용자의 신원을 올바르게 확인하거나 인증하지 못하는 상황을 의미합니다. 이는 공격자가 다른 사용자의 계정을 탈취하거나, 시스템에 무단으로 접근할 수 있는 기회를 제공합니다.
Identification and Authentication Failures가 발생하는 이유
- 약한 비밀번호 정책
- 다중 인증 미사용
- 비밀번호 저장 및 관리 오류
- 세션 관리 취약점
방어 및 예방
- 강력한 비밀번호 정책: 최소한의 비밀번호 길이와 복잡성을 요구하고, 정기적인 비밀번호 변경을 권장합니다.
- 다중 인증: 다중 인증(MFA)을 사용하여 보안을 강화합니다.
- 비밀번호 저장 보안: 안전한 해시 알고리즘을 사용하여 비밀번호를 저장하고, 솔트를 적용하여 해시 값을 강화합니다.
- 세션 관리: 안전한 세션 관리를 구현하고, 세션 타임아웃 및 재인증을 설정합니다.
- 정기적인 보안 테스트: 정기적으로 보안 테스트를 수행하여 식별 및 인증 관련 취약점을 발견하고 수정합니다.
A8. Software and Data Integrity Failures (소프트웨어 및 데이터 무결성 실패)
소프트웨어 및 데이터 무결성 실패는 소프트웨어 또는 데이터의 무결성이 손상되는 상황을 의미합니다. 이는 악성 코드 삽입, 데이터 변조 또는 무결성 검증 실패로 인해 발생할 수 있습니다.
Software and Data Integrity Failures가 발생하는 이유
- 코드 서명 및 검증 미흡
- 무결성 검증 실패
- 악성 코드 삽입
- 데이터 변조
방어 및 예방
- 코드 서명 및 검증: 모든 소프트웨어 및 업데이트에 대해 코드 서명 및 검증을 수행하여 무결성을 보장합니다.
- 무결성 검증: 데이터 무결성을 확인하기 위해 체크섬 또는 해시 값을 사용하여 정기적으로 검증합니다.
- 악성 코드 방지: 악성 코드 삽입을 방지하기 위해 안전한 코딩 및 보안 검토를 수행합니다.
- 데이터 보호: 데이터 변조를 방지하기 위해 암호화 및 무결성 검증을 적용합니다.
- 정기적인 보안 테스트: 정기적으로 보안 테스트를 수행하여 소프트웨어 및 데이터 무결성을 위협하는 취약점을 발견하고 해결합니다.
A9. Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패)
보안 로깅 및 모니터링 실패는 보안 이벤트를 적절히 기록하거나 모니터링하지 못하는 상황을 의미합니다. 이는 보안 사고 발생 시 이를 신속히 탐지하고 대응하는 것을 어렵게 만듭니다.
Security Logging and Monitoring Failures가 발생하는 이유
- 로깅 미구현 또는 미흡
- 보안 이벤트 모니터링 부족
- 경고 및 알림 미흡
- 로그 데이터 분석 실패
방어 및 예방
- 로깅 구현: 중요한 보안 이벤트를 로그에 기록하고, 로그 데이터의 무결성을 보장합니다.
- 실시간 모니터링: 보안 이벤트를 실시간으로 모니터링하고, 이상 징후를 신속히 탐지합니다.
- 경고 및 알림 설정: 보안 이벤트 발생 시 경고 및 알림을 설정하여 신속히 대응할 수 있도록 합니다.
- 로그 데이터 분석: 로그 데이터를 정기적으로 분석하여 잠재적인 보안 문제를 식별하고 대응합니다.
- 보안 인프라 강화: 보안 로깅 및 모니터링 인프라를 강화하여 로그 데이터의 무결성과 가용성을 보장합니다.
A10. Server-Side Request Forgery (SSRF) (서버 측 요청 위조)
서버 측 요청 위조(SSRF)는 공격자가 서버를 통해 다른 시스템에 임의의 요청을 보내는 공격을 의미합니다. SSRF는 종종 방화벽 뒤에 있는 내부 시스템에 접근하거나, 민감한 데이터를 탈취하기 위해 사용됩니다.
SSRF가 발생하는 이유
- 외부 입력을 검증하지 않고 서버 측 요청을 수행
- 서버의 권한으로 내부 네트워크에 접근 가능
- 잘못된 URL 처리 및 검증
방어 및 예방
- 입력 검증: 외부 입력을 철저히 검증하고, 허용된 형식 및 도메인만 접근하도록 제한합니다.
- 네트워크 분리: 서버가 내부 네트워크에 접근할 수 없도록 네트워크를 분리하고, 방화벽 규칙을 강화합니다.
- 안전한 URL 처리: URL 처리 시 안전한 라이브러리를 사용하고, 입력 값을 적절히 인코딩 및 검증합니다.
- 접근 제어: 서버의 권한을 최소화하고, 불필요한 내부 네트워크 접근을 제한합니다.
- 정기적인 보안 테스트: 정기적으로 보안 테스트를 수행하여 SSRF 취약점을 식별하고 해결합니다.
출처: https://oobwrite.com/entry/OWASP-TOP10-2023-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%A0%95%EB%A6%AC