티스토리 뷰
OWASP는 Open Web Application Security Project의 약자이고 웹 어플리케이션 보안을 위해 힘쓰는 비영리 조직이 진행하는 프로젝트이다. 매년 보안상 이슈가 될 항목들에 대해 10가지를 선정하여 발표한다. 그게 OWASP top 10이다.
매년 top 10에 속해있는 항목이 바뀌지만 굵직한 놈들(Injection, XSS, CSRF..) 은 항상 껴있다.
2021년에는 어떤 항목들이 Top 10에 선정이 되었는지 살펴보자. (잘 나온 원문을 번역기 돌렸으니 이해를..)
THE OWASP TOP 10 LIST
1. INJECTION ATTACKS (인젝션)
주입 공격은 공격자가 악성 코드를 응용 프로그램에 입력함으로써 데이터 또는 전체 응용 프로그램을 손상시키는 명령을 강제로 실행하는 것을 말합니다. 가장 일반적인 유형의 주입 공격은 SQL 주입 및 사이트 간 스크립팅(XSS) 공격이지만 코드 주입, 명령 주입, CCS 주입 등도 있습니다.
SQL 주입은 사용자 입력에서 메타 문자의 마스킹 또는 유효성 검사 부족으로 인해 발생하는 SQL 데이터베이스 취약성을 공격하는 것을 의미합니다.
공격자는 데이터베이스에 액세스할 수 있는 응용 프로그램을 통해 자신의 데이터베이스 명령을 주입하려고 시도합니다. 그러나 요청이 올바르게 검증되지 않으면 삽입된 코드가 원래 SQL 명령을 변경하여 공격자에게 유리한 결과를 변경합니다.
공격이 성공하면 공격자는 데이터를 감시하고 데이터를 수정하거나 모두 삭제하며 서버를 제어할 수 있습니다. 이를 위해 공격자는 시스템을 위반하는 여러 가지 방법을 사용할 수 있습니다. 예를 들어, 응답 시간 또는 오류 메시지를 통해 시스템으로 들어가는 방법을 찾을 수 있습니다.
SQL 주입 공격을 방지하는 방법
주입 결함을 방지하는 주요 방법은 데이터베이스의 데이터를 명령 및 쿼리, 즉 웹 애플리케이션 로직과 분리하는 것입니다. 이 작업은 다음과 같은 여러 가지 방법으로 수행할 수 있습니다.
- 인터프리터를 사용하지 않거나 매개 변수화된 쿼리를 사용하는 안전한 API 사용
- 긍정적인 서버 측 입력 유효성 검사 도입(휘텔리스트)
- 응용 프로그램에 특수 문자가 필요한 경우, 가능한 경우 특정 인터프리터의 이스케이프 구문을 통해 특수 문자를 피해야 합니다.
- LIMIT SQL 절과 같은 쿼리 내의 데이터베이스 컨트롤을 사용하여 주입이 성공할 경우 노출되는 데이터 양을 최소화합니다.
2. BROKEN AUTHENTICATION (취약한 인증)
인증 및 세션 관리와 관련된 응용 프로그램 기능은 종종 잘못 구현되어 공격자가 암호, 키 또는 세션 토큰을 손상시키거나 다른 구현 결함을 이용하여 사용자의 ID를 일시적으로 또는 영구적으로 가정할 수 있습니다.
이러한 취약성을 악용하면 공격자가 사용자 세션을 가로채 권한이 없는 정보에 액세스하거나 수정할 수 있습니다.
취약한 인증 방지하는 방법
취약한 인증에 대한 공격을 방지하려면 다음 작업을 수행하는 것이 좋습니다.
- 암호의 약점 또는 강도를 결정하는 암호 검사 도입
- 강력한 최신 증거 기반 암호 정책에 따라 암호 길이, 복잡성 및 순환 조정
- 도난된 자격 증명, 무차별적인 공격, 스터핑 등의 사용을 방지하는 다단계 인증 도입
- 시간이 제한된 새 세션 ID와 임의 세션 ID를 생성하는 서버측 보안 세션 관리자 사용
- URL에 세션 ID를 사용하지 않도록 하고 안전하게 저장하며 사용자 로그아웃, 세션 시간 초과 및 유휴 후 해당 ID가 무효화되도록 합니다.
- 기본 자격 증명을 사용할 때 배포 허용 안 함
- 모니터링하는 동안 실패한 로그인 시도를 제한하거나 지연합니다. 공격이 탐지될 때 관리자에게 경고 구현
3. SENSITIVE DATA EXPOSURE (민감 데이터 노출)
민감한 데이터 노출은 가장 일반적인 공격 중 하나입니다. 보호되지 않는 유휴 데이터 또는 전송 중인 데이터(전송된 데이터)에 액세스, 수정 또는 도용하는 것으로 구성됩니다. 이러한 데이터에는 자격 증명, 건강 기록, 신용카드 번호 등과 같은 개인 식별 가능 정보(PII)가 자주 포함됩니다. 암호화의 부족은 데이터가 노출되는 방법 중 하나입니다.
중요한 데이터에 대한 액세스 권한을 얻는 방법은 다양하지만 공격자가 키를 훔치거나 경로 내 공격(맨 인 더 미들이라고도 함), 서버 또는 사용자로부터 명확한 텍스트 데이터를 훔치는 등의 방법이 포함될 수 있습니다.
중요한 데이터 노출을 방지하는 방법
중요한 데이터가 노출되지 않도록 여러 가지 작업을 수행할 수 있습니다. 다음은 다음과 같습니다.
- 전송 중인 데이터를 보호하기 위한 전송 계층 보안(TLS) 구현
- 가능하면 중요한 데이터를 저장하거나 필요 이상으로 오래 보관하지 않음
- 저장해야 하는 모든 유휴 데이터 암호화
- HSTS(Http Strict Transport Security) 또는 유사한 지시사항을 통해 암호화 시행
- 중요한 데이터를 포함하는 사용자 응답을 캐시하지 않음
- 데이터 분류(처리, 저장 또는 전송) 및 분류에 따라 제어 적용
- 강력한 표준 알고리즘, 프로토콜 및 키 구현 (brcrypt, scrypt, Argon2, PBKDF2와 같은 항상 salt 및 hash 암호를 사용하는 해시 함수 사용)
4. XML EXTERNAL ENTITIES (XML 외부 개체(XXE))
기본적으로 오래된 또는 잘못 구성된 많은 XML 프로세서는 XML 문서 내의 외부 엔티티 참조를 평가합니다. 이 취약성을 공격하면 XML 문서(예: DOCX 또는 SVG 파일)를 업로드하거나 XML 문서에 악의적인 내용을 포함할 수 있습니다.
이 시나리오에서는 외부 엔터티를 사용하여 파일 URI 핸들러를 사용하여 내부 파일을 추출할 수 있습니다. 또한 내부 파일 공유, 내부 포트 검색, 원격 요청 실행 및 DOS(서비스 거부 공격) 성능을 활성화할 수 있습니다.
XML 외부 엔터티 공격을 방지하는 방법
이 공격을 방지하기 위해 개발자는 XXE를 테스트, 식별 및 완화하는 방법에 대한 교육을 받아야 합니다. 또한 OWASP는 다음과 같은 조치를 권고한다.
- 잠재적으로 중요한 정보의 직렬화를 방지하고 덜 복잡한 JSON과 같은 데이터 형식을 사용합니다.
- XML 문서를 통한 악의적인 데이터를 방지하기 위한 화이트리스트 서버 측 입력 유효성 검사
- XML 스키마를 통해 들어오는 XML 유효성 검사(예: XSD 유효성 검사)
- XML 라이브러리 및 프로세서가 정기적으로 패치 또는 업그레이드되었는지 확인
- 구문 분석기에서 DTD(문서 유형 정의) 처리를 완전히 사용하지 않도록 설정(DOS에 대해서도 구문 분석기를 보호)
- XXE 인스턴스의 소스 코드를 수동으로 검토
5. BROKEN ACCESS CONTROL (취약한 접근 통제)
취약한 접근 통제는 인증된 사용자의 작업에 대한 제한사항의 시행 시 취약성을 나타냅니다. 제한이 제대로 시행되지 않으면 공격자는 이 약점을 이용하여 시스템 기능 및 중요 개인 데이터에 대한 무단 관리 액세스 권한을 얻을 수 있습니다. 또한 데이터를 생성, 수정 또는 삭제할 수도 있습니다.
취약한 접근 통제를 방지하는 방법
취약한 접근 통제를 하려면 신뢰할 수 있는 서버측 코드 또는 서버가 없는 API에서 액세스 제어를 시행해야 합니다. 이렇게 하면 공격자가 액세스 제어 검사 또는 메타데이터를 수정할 수 없습니다. OWASP는 이러한 유형의 공격을 방지하기 위한 다음 조치를 열거한다.
- 공용 리소스 제외, 기본적으로 거부
- 액세스 제어 메커니즘을 도입하고 애플리케이션 전체에 걸쳐 반복적으로 사용
- 레코드 소유권 적용
- 액세스 제어 장애 기록 및 모니터링, 필요한 경우 관리자에게 알림(반복된 로그인 시도)
- 로그아웃 후 JWT(JSON 웹 토큰) 무효화
- 도메인 모델을 통해 고유한 애플리케이션 비즈니스 제한 요구사항 적용
- 웹 루트에 메타데이터 및 백업 파일이 없는지 확인
- 서버 디렉터리 목록 사용 안 함
- 기능적 접근 제어 장치 및 통합 테스트 수행
또한 다음을 수행할 수 있습니다.
- 비활성 또는 불필요한 계정 삭제
- 모든 액세스 지점에 다중 요소 인증 구현
- 필요하지 않은 액세스 지점 수 감소
- 최소 권한 원칙 구현(PoLP)
- 서버에 필요하지 않은 서비스 종료
6. SECURITY MISCONFIGURATION (잘못된 보안 구성)
잘못된 보안 구성은 공격을 여는 일반적인 문제입니다. 이는 일반적으로 다음과 같은 결과입니다.
- 안전하지 않은 기본 구성
- 불완전하거나 임시 구성
- 일치하지 않는 결함
- 사용하지 않는 페이지
- 보호되지 않은 파일 및 디렉터리
- 개방형 클라우드 스토리지
- 잘못 구성된 HTTP 헤더 또는 암호화
- 중요한 정보를 포함하는 상세 오류 메시지
- 모든 운영 체제, 프레임워크, 라이브러리 및 애플리케이션을 안전하게 구성해야 할 뿐만 아니라 적절한 시기에 패치/업그레이드해야 합니다.
Crashtest Security와 같은 자동화된 펜티스트 도구는 잘못된 보안 구성을 통해 위반을 초래할 수 있는 보안 결함을 탐지하는 데 도움이 됩니다. 무료 평가판에 등록하고 몇 분 안에 첫 번째 검색을 시작합니다.
잘못된 보안 구성을 방지하는 방법
OWASP는 보안 설치 프로세스의 구현을 권고한다. 이와 함께 다음을 수행해야 합니다.
- 동일하지만 다른 자격 증명을 통해 액세스할 수 있는 보안 환경을 빠르고 쉽게 구축할 수 있는 프로세스 개발 및 자동화
- 최소 플랫폼을 배포하고 사용하지 않는 기능 및 프레임워크를 제거하거나 설치하지 않음
- 구성요소와 테넌트를 구분하는 세그먼트 애플리케이션 아키텍처 도입
- 모든 보안 노트, 업데이트 및 패치, 특히 클라우드 스토리지 권한의 구성 검토 및 업데이트
- 모든 환경에서 보안 구성의 효율성에 대한 모니터링 및 검증 자동화
- 자동화된 워크플로우를 통해 보안 문제 실시간 해결
7. CROSS-SITE SCRIPTING (XSS)
사이트 간 스크립팅은 웹 응용 프로그램에 클라이언트측 스크립트를 주입하는 것으로, 사용자 입력을 검증하지 않고 올바르게 인코딩하여 활성화됩니다. 악의적인 스크립트는 최종 사용자의 브라우저 내에서 실행되며 세션 도용부터 영향을 받는 웹 사이트에서 수행한 작업을 모니터링 및 변경하는 등 다양한 공격을 가능하게 합니다.
사이트 간 스크립팅 공격은 악의적인 스크립트가 비영구적 방식으로 주입되는지 또는 영구적 방식으로 주입되는지 여부에 따라 여러 가지 유형이 있습니다. 또한 클라이언트 또는 서버 측의 잘못된 입력 유효성 검사로 인해 발생하는 취약성 간에 차이가 발생합니다.
사이트 간 스크립팅(XSS)을 방지하는 방법
OWASP에 따르면 이러한 유형의 공격을 방지하는 주요 방법은 신뢰할 수 없고 검증되지 않은 데이터 입력을 활성 브라우저 콘텐츠에서 분리하는 것이다. 이 작업은 다음과 같은 방법으로 수행할 수 있습니다.
- React JS, Ruby on Rails와 같은 프레임워크와 디자인으로 XSS를 대부분 피하는 다른 프레임워크 사용
- OWASP Cheat Sheet 시리즈 'XSS Prevention'에 정의된 허용된 슬롯을 제외하고 HTML에서 신뢰할 수 없는 HTTP 요청 데이터를 피하십시오.
- HTML 요소에 신뢰할 수 없는 데이터를 삽입하기 전에 HTML 인코딩 사용
- DOM 기반 XSS에 대해 상황별 인코딩 적용
- 클라이언트 측 리소스에 대한 원본 허용 목록을 만드는 CSP(콘텐츠 보안 정책)를 구현합니다. 로컬 파일을 통해 악성 코드를 삽입할 수 있는 취약성이 없는 경우 유용합니다.
8. INSECURE DESERIALIZATION (안전하지 않은 역직렬화)
안전하지 않은 역직렬화는 조작된 개체가 웹 응용 프로그램의 컨텍스트에 주입되는 공격입니다. 응용 프로그램 취약성이 있는 경우 개체가 역직렬화되고 실행되어 SQL 주입, 경로 트래버설, 응용 프로그램 서비스 거부 및 원격 코드 실행이 발생합니다.
안전하지 않은 역직렬화를 방지하는 방법
안전하지 않은 역직렬화로부터 보호하기 위해 OWASP는 다음 단계를 권장합니다.
- 신뢰할 수 없는 소스에서 직렬화된 개체 거부
- 원시 데이터 유형을 허용하는 직렬화 매체만 활용
- 디지털 서명을 구현하여 직렬화된 개체의 무결성 검사
- 역직렬화 중에 예기치 않은 절을 탐지하기 위해 엄격한 형식 제약 조건 적용
- 가능한 경우 권한이 낮은 환경에서 역직렬화 코드를 분리 및 실행하여 무단 작업 방지
- 역직렬화 예외 및 실패 인스턴스 기록
- 역직렬화 서버 또는 컨테이너에서 들어오는 모든 송신 또는 수신 네트워크 연결 모니터링 및/또는 제한
9. USING COMPONENTS WITH KNOWN VULNERABILITIES (알려진 취약점이 있는 구성요소 사용)
라이브러리, 프레임워크 및 기타 소프트웨어 모듈과 같은 구성 요소의 권한은 응용 프로그램의 권한과 동일합니다. 취약한 구성 요소를 공격하면 데이터 손실 및 서버 테이크오버가 가능합니다. 알려진 취약성이 있는 구성 요소를 사용하는 애플리케이션과 API는 애플리케이션 방어를 손상시키고 다양한 공격과 영향을 발생시킬 수 있습니다. 이것은 널리 퍼진 문제이다.
알려진 취약성이 있는 구성 요소를 사용하고 있는지 여부를 평가하기 위해 지문 채취 스캐너는 서버에서 실행 중인 웹 서버 또는 웹 응용 프로그램 프레임워크 및 관련 버전을 탐지하려고 시도합니다.
알려진 취약점이 있는 구성 요소의 사용을 피하는 방법
이러한 구성 요소의 사용을 교정하려면 다음을 수행해야 합니다.
- 보안 링크를 통해서만 공식 출처의 구성 요소를 사용하십시오. 서명된 패키지를 사용하여 패키지에 악의적인 구성 요소가 포함될 가능성을 최소화합니다.
- 유지 관리되지 않고 이전 버전에 대한 보안 패치를 제공하지 않는 모든 라이브러리 및 구성 요소 모니터링
- 패치되지 않은 구성 요소의 문제를 모니터링, 감지 및 보호하기 위한 가상 패치 배포
- 사용되지 않는 모든 종속성은 물론 필요하지 않은 기능, 구성 요소, 파일 및 설명서 제거
- 클라이언트 측 및 서버 측 구성 요소와 해당 버전 및 종속성의 최신 인벤토리 유지 구성 요소 취약성에 대한 중요한 소스 모니터링 및 프로세스 자동화
- 애플리케이션 수명 동안 모니터링, 분류, 업데이트 또는 변경 구성 생성 및 지속적으로 실행
10. INSUFFICIENT LOGGING AND MONITORING (불충분한 로깅과 모니터링)
불충분한 로깅 및 모니터링과 인시던트 대응의 누락 또는 비효율적인 통합이 결합되면 공격자는 시스템을 더욱 공격하고, 지속성을 유지하며, 더 많은 시스템으로 피벗하고, 데이터를 변조, 추출 또는 파괴할 수 있습니다.
대부분의 위반 연구에 따르면 위반을 탐지하는 데 걸리는 시간은 200일이 넘으며, 일반적으로 내부 프로세스나 모니터링이 아닌 외부 당사자에 의해 탐지됩니다.
로깅 및 모니터링 부족으로 인한 공격을 피하는 방법
이 문제로 인해 발생하는 일반적인 취약성을 방지하려면 다음을 수행하는 것이 좋습니다.
- 로그인, 액세스 제어 실패 및 서버 측 입력 유효성 검사 실패 시 충분한 사용자 컨텍스트가 기록되고 로그 데이터는 충분히 오래 유지됩니다. 의심스러운 활동과 계정을 찾는 데 도움이 됩니다.
- 로그 관리 솔루션에서 쉽게 처리할 수 있는 로그 형식 사용
- 모든 트랜잭션에 대한 무결성 제어 기능을 통해 감사 추적 구현하여 삭제 또는 변조 시도 방지
- 모니터링 및 경고를 사용하여 의심스러운 활동을 제때 발견하고 조치를 취함
- 공격에 효율적으로 대처하기 위한 사고 대응 및 복구 계획 도입
끝!
'Framework > Security' 카테고리의 다른 글
OWASP Top 10 2022 한글 version (0) | 2022.06.13 |
---|---|
Spring boot Security 기본 로그인 방법 및 계정 (0) | 2022.02.09 |
Spring Security remember-me 사용하여 로그인 유지하기 예제 (0) | 2021.07.22 |
KeyCloak Session, Token Timeout 설정하기 (0) | 2021.01.14 |
JasperException : security/tags cannot be resolved in either web.xml or the jar files deployed with this application 오류 (0) | 2021.01.13 |