From e23b4f0024d8df2acdaf12255e187ab990e690d0 Mon Sep 17 00:00:00 2001 From: ni5am Date: Fri, 26 Dec 2025 12:33:11 +0900 Subject: [PATCH 001/167] create ko directory for Korean translation --- 2025/docs/ko/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 2025/docs/ko/.gitkeep diff --git a/2025/docs/ko/.gitkeep b/2025/docs/ko/.gitkeep new file mode 100644 index 000000000..e69de29bb From 7faee2079aa4b26123a393cd53892413f803ad6e Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Fri, 26 Dec 2025 13:23:34 +0900 Subject: [PATCH 002/167] 0x00-with claude draft --- 2025/docs/kr/0x00_2025-Introduction.md | 115 +++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 2025/docs/kr/0x00_2025-Introduction.md diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md new file mode 100644 index 000000000..2e9f110a0 --- /dev/null +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -0,0 +1,115 @@ +![OWASP Logo](../assets/TOP_10_logo_Final_Logo_Colour.png) + +# 가장 위험한 10대 웹 애플리케이션 보안 위험 + +# 소개 + +OWASP Top 10의 8번째 버전을 환영합니다! + +설문 조사에서 데이터와 관점을 제공해 준 모든 분께 깊은 감사를 드립니다. 여러분 없이는 이번 버전이 나올 수 없었습니다. **감사합니다!** + + +## OWASP Top 10:2025 소개 + + + +* [A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md) +* [A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md) +* [A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md) +* [A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md) +* [A05:2025 - 인젝션](A05_2025-Injection.md) +* [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) +* [A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md) +* [A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md) +* [A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md) +* [A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md) + + +## 2025년 Top 10의 변화 + +2025년 Top 10에는 두 개의 신규 범주와 하나의 통합이 있습니다. 가능한 한 증상보다는 근본 원인에 초점을 맞추려고 노력했습니다. 소프트웨어 공학과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 범주를 만드는 것은 사실상 불가능합니다. + +![Mapping](../assets/2025-mappings.png) + +* **[A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지합니다. 제공된 데이터에 따르면 평균적으로 테스트된 애플리케이션의 3.73%가 이 범주의 40개 공통 약점 열거(CWE) 중 하나 이상을 가지고 있었습니다. 위 그림의 점선으로 표시된 것처럼, 서버 측 요청 위조(SSRF)가 이 범주에 통합되었습니다. +* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년의 5위에서 2025년에는 2위로 상승했습니다. 이번 주기의 데이터에서 설정 오류가 더 많이 나타납니다. 테스트된 애플리케이션의 3.00%가 이 범주의 16개 CWE 중 하나 이상을 가지고 있었습니다. 소프트웨어 공학이 구성에 기반한 애플리케이션의 동작을 계속 증가시키고 있기 때문에 이는 놀랍지 않습니다. +* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라의 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 넓은 범위의 침해를 포함합니다. 이 범주는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 투표되었습니다. 이 범주는 5개의 CWE를 포함하며 수집된 데이터에서 제한적으로 나타나지만, 이는 테스트의 어려움 때문이라고 생각하며 이 분야의 테스트가 따라잡기를 희망합니다. 이 범주는 데이터에서 가장 적은 발생 빈도를 보이지만, CVE의 평균 악용 및 영향 점수는 가장 높습니다. +* **[A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했습니다. 제공된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 범주의 32개 CWE 중 하나 이상을 가지고 있습니다. 이 범주는 종종 민감한 데이터 노출이나 시스템 침해로 이어집니다. +* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지합니다. 인젝션은 가장 많이 테스트되는 범주 중 하나이며, 이 범주의 38개 CWE와 연관된 CVE의 수가 가장 많습니다. 인젝션에는 크로스 사이트 스크립팅(높은 빈도/낮은 영향)에서 SQL 인젝션(낮은 빈도/높은 영향) 취약점에 이르기까지 다양한 문제가 포함됩니다. +* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패가 추월하면서 순위에서 4위에서 6위로 두 단계 하락했습니다. 이 범주는 2021년에 도입되었으며, 위협 모델링과 관련하여 업계에서 눈에 띄는 개선과 보안 설계에 대한 더 큰 강조를 보았습니다. +* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 이 범주의 36개 CWE를 더 정확하게 반영하기 위해 약간의 이름 변경(이전에는 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지합니다. 이 범주는 여전히 중요하지만, 인증을 위한 표준화된 프레임워크의 증가된 사용이 인증 실패 발생에 유익한 효과를 미치는 것으로 보입니다. +* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 계속 유지합니다. 이 범주는 신뢰 경계를 유지하고 소프트웨어 공급망 실패보다 낮은 수준에서 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 실패에 초점을 맞춥니다. +* **[A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지합니다. 이 범주는 관련 로깅 이벤트에 대한 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 이름 변경(이전에는 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었습니다. 경고 없이 훌륭한 로깅은 보안 사고를 식별하는 데 최소한의 가치만 있습니다. 이 범주는 항상 데이터에서 과소평가되며, 커뮤니티 설문 조사 참가자들의 투표로 다시 목록의 위치에 올랐습니다. +* **[A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년의 새로운 범주입니다. 이 범주는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 열림 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함합니다. + + +## 방법론 + +이번 Top 10 버전은 데이터에 기반하지만, 맹목적으로 데이터에만 의존하지 않습니다. 제공된 데이터를 기반으로 12개 범주의 순위를 매기고, 커뮤니티 설문 조사의 응답에 의해 2개를 승격하거나 강조하도록 허용했습니다. 이를 수행하는 근본적인 이유는 다음과 같습니다. 제공된 데이터를 검토하는 것은 본질적으로 과거를 들여다보는 것입니다. 애플리케이션 보안 연구자들은 새로운 취약점을 식별하고 새로운 테스트 방법을 개발하는 데 시간을 할애합니다. 이러한 테스트를 도구와 프로세스에 통합하는 데는 몇 주에서 몇 년이 걸립니다. 대규모로 약점을 안정적으로 테스트할 수 있을 때까지 몇 년이 지났을 수 있습니다. 또한 안정적으로 테스트할 수 없고 데이터에 나타나지 않을 수 있는 중요한 위험도 있습니다. 그 관점의 균형을 맞추기 위해, 커뮤니티 설문 조사를 사용하여 최전선에 있는 애플리케이션 보안 및 개발 실무자들에게 테스트 데이터에서 과소평가될 수 있는 필수 위험으로 무엇을 보는지 물어봅니다. + + +## 범주의 구조화 방법 + +몇 가지 범주가 이전 OWASP Top 10에서 변경되었습니다. 다음은 범주 변경 사항의 개괄적인 요약입니다. + +이번 반복에서는 2021년 판에서 했던 것처럼 CWE에 대한 제한 없이 데이터를 요청했습니다. 특정 연도(2021년부터 시작)에 테스트된 애플리케이션의 수와 테스트에서 발견된 CWE의 인스턴스가 하나 이상 있는 애플리케이션의 수를 요청했습니다. 이 형식을 통해 애플리케이션 모집단 내에서 각 CWE가 얼마나 널리 퍼져 있는지 추적할 수 있습니다. 우리의 목적상 빈도는 무시합니다. 다른 상황에서는 필요할 수 있지만, 애플리케이션 모집단에서의 실제 확산 정도만 숨길 뿐입니다. 애플리케이션에 CWE의 인스턴스가 4개 있든 4,000개 있든 Top 10 계산의 일부가 아닙니다. 특히 수동 테스터는 애플리케이션에서 반복되는 횟수에 관계없이 취약점을 한 번만 나열하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 취약점의 모든 인스턴스를 고유한 것으로 나열합니다. 2017년에는 약 30개의 CWE에서 2021년에는 거의 400개의 CWE로, 이번 판에서는 데이터 세트에서 분석할 589개의 CWE로 증가했습니다. 향후 보완 자료로 추가 데이터 분석을 수행할 계획입니다. CWE 수의 이러한 상당한 증가는 범주 구조화 방법의 변경을 필요로 합니다. + +수개월 동안 CWE를 그룹화하고 범주화하는 데 시간을 보냈으며 추가로 몇 달을 더 계속할 수도 있었습니다. 어느 시점에서 멈춰야 했습니다. CWE에는 근본 원인 유형과 증상 유형이 모두 있으며, 근본 원인 유형은 "암호화 실패" 및 "설정 오류"와 같고 증상 유형은 "민감한 데이터 노출" 및 "서비스 거부"와 같습니다. 식별 및 해결 지침을 제공하는 데 더 논리적이기 때문에 가능한 한 근본 원인에 초점을 맞추기로 결정했습니다. 증상보다 근본 원인에 초점을 맞추는 것은 새로운 개념이 아닙니다. Top 10은 증상과 근본 원인이 혼합되어 있었습니다. CWE도 증상과 근본 원인이 혼합되어 있습니다. 우리는 단순히 이를 더 의도적으로 명시하고 있을 뿐입니다. 이번 판에서는 범주당 평균 25개의 CWE가 있으며, 하한선은 A03:2025-소프트웨어 공급망 실패의 5개 CWE와 A09:2025 보안 로깅 및 경고 실패에서 A01:2025-취약한 접근 통제의 40개 CWE까지입니다. 범주의 CWE 수를 40개로 제한하기로 결정했습니다. 이 업데이트된 범주 구조는 기업이 언어/프레임워크에 적합한 CWE에 집중할 수 있으므로 추가적인 교육 이점을 제공합니다. + +MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 Top 10을 10개의 CWE 목록으로 전환하지 않는 이유가 무엇인지 질문을 받았습니다. 범주에서 여러 CWE를 사용하는 주요 이유는 두 가지입니다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아닙니다. 이는 Top 10의 일부가 적용되지 않을 수 있으므로 도구 및 교육/인식 프로그램에 문제를 일으킵니다. 두 번째 이유는 일반적인 취약점에 대해 여러 CWE가 있다는 것입니다. 예를 들어, 일반 인젝션, 명령 인젝션, 크로스 사이트 스크립팅, 하드코딩된 암호, 유효성 검증 부족, 버퍼 오버플로, 민감한 정보의 평문 저장 및 기타 여러 가지에 대해 여러 CWE가 있습니다. 조직이나 테스터에 따라 다른 CWE가 사용될 수 있습니다. 여러 CWE가 있는 범주를 사용함으로써 공통 범주 이름 아래에서 발생할 수 있는 다양한 유형의 약점에 대한 기준과 인식을 높이는 데 도움이 될 수 있습니다. 이번 Top 10 2025 판에서는 10개 범주 내에 248개의 CWE가 있습니다. 이 릴리스 시점에서 [MITRE에서 다운로드할 수 있는 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 있습니다. + + +## 범주 선택을 위한 데이터 사용 방법 + +2021년 판에서 했던 것과 유사하게, *악용 가능성*과 *(기술적) 영향*을 위해 CVE 데이터를 활용했습니다. OWASP Dependency Check를 다운로드하고 CVSS 악용 및 영향 점수를 추출하여 CVE와 함께 나열된 관련 CWE별로 그룹화했습니다. 모든 CVE에는 CVSSv2 점수가 있지만 CVSSv2에는 CVSSv3에서 해결해야 할 결함이 있기 때문에 상당한 연구와 노력이 필요했습니다. 특정 시점 이후에는 모든 CVE에 CVSSv3 점수도 할당됩니다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 공식이 업데이트되었습니다. + +CVSSv2에서는 악용 가능성과 (기술적) 영향이 모두 최대 10.0까지 가능했지만, 공식이 악용 가능성은 60%, 영향은 40%로 낮췄습니다. CVSSv3에서는 이론적 최댓값이 악용 가능성은 6.0, 영향은 4.0으로 제한되었습니다. 가중치를 고려할 때, 영향 점수는 CVSSv3에서 평균 거의 1.5점 더 높게 이동했고 악용 가능성은 평균 거의 0.5점 더 낮게 이동했습니다. + +NVD(National Vulnerability Database)에서 CWE에 매핑된 약 175,000개의 CVE 레코드(2021년의 125,000개에서 증가)가 OWASP Dependency Check에서 추출되었습니다. 또한 CVE에 매핑된 643개의 고유한 CWE가 있습니다(2021년의 241개에서 증가). 추출된 거의 220,000개의 CVE 중에서 160,000개는 CVSS v2 점수를, 156,000개는 CVSS v3 점수를, 6,000개는 CVSS v4 점수를 가지고 있었습니다. 많은 CVE가 여러 점수를 가지고 있기 때문에 합계가 220,000개를 초과합니다. + +Top 10 2025의 경우, 다음과 같은 방식으로 평균 악용 및 영향 점수를 계산했습니다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3를 가진 모집단의 비율과 CVSSv2 점수를 가진 나머지 모집단으로 악용 및 영향 점수를 가중하여 전체 평균을 얻었습니다. 이러한 평균을 데이터 세트의 CWE에 매핑하여 위험 방정식의 나머지 절반에 대한 악용 및 (기술적) 영향 점수로 사용했습니다. + +CVSS v4.0을 사용하지 않는 이유가 궁금할 수 있습니다. 이는 점수 알고리즘이 근본적으로 변경되었고, CVSS v2 및 CVSSv3처럼 *악용* 또는 *영향* 점수를 더 이상 쉽게 제공하지 않기 때문입니다. 향후 버전의 Top 10에 CVSS v4.0 점수를 사용하는 방법을 파악하려고 시도할 것이지만, 2025년 판에는 적시에 그렇게 할 방법을 결정할 수 없었습니다. + + +## 커뮤니티 설문 조사를 사용하는 이유 + +데이터의 결과는 대부분 업계에서 자동화된 방식으로 테스트할 수 있는 것으로 제한됩니다. 숙련된 애플리케이션 보안 전문가와 대화하면, 그들이 발견하는 것과 아직 데이터에 없는 추세에 대해 이야기할 것입니다. 사람들이 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 걸리고, 그 테스트가 자동화되어 대규모 애플리케이션 모집단에 대해 실행되는 데 더 많은 시간이 걸립니다. 우리가 발견하는 모든 것은 과거를 되돌아보는 것이며, 데이터에 나타나지 않는 작년의 추세를 놓칠 수 있습니다. + +따라서 우리는 데이터에서 10개 범주 중 8개만 선택합니다. 왜냐하면 불완전하기 때문입니다. 나머지 두 범주는 Top 10 커뮤니티 설문 조사에서 나옵니다. 이를 통해 최전선의 실무자들이 데이터에 없고 (데이터로 표현되지 않을 수도 있는) 가장 높은 위험으로 보는 것에 투표할 수 있습니다. + + +## 데이터 제공자에게 감사드립니다 + +다음 조직들이 (여러 익명 기부자와 함께) 280만 개 이상의 애플리케이션에 대한 데이터를 제공하여 이것이 가장 크고 포괄적인 애플리케이션 보안 데이터 세트가 되도록 도와주었습니다. 여러분 없이는 이것이 불가능했을 것입니다. + +* Accenture (Prague) +* Anonymous (multiple) +* Bugcrowd +* Contrast Security +* CryptoNet Labs +* Intuitor SoftTech Services +* Orca Security +* Probely +* Semgrep +* Sonar +* usd AG +* Veracode +* Wallarm + +## 주요 저자 +* Andrew van der Stock - X: [@vanderaj](https://x.com/vanderaj) +* Brian Glas - X: [@infosecdad](https://x.com/infosecdad) +* Neil Smithline - X: [@appsecneil](https://x.com/appsecneil) +* Tanya Janca - X: [@shehackspurple](https://x.com/shehackspurple) +* Torsten Gigler - Mastodon: [@torsten_gigler@infosec.exchange](https://infosec.exchange/@torsten_gigler) + +## 이슈 및 풀 리퀘스트 제출 + +수정 사항이나 이슈를 제출해 주시기 바랍니다. + +### 프로젝트 링크: +* [홈페이지](https://owasp.org/www-project-top-ten/) +* [GitHub 저장소](https://github.com/OWASP/Top10) + + From e86ad34129632e8c71daeed82b29efbacfccf9c9 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Fri, 26 Dec 2025 13:27:42 +0900 Subject: [PATCH 003/167] Add document on 0x02 --- ...025-What_are_Application_Security_Risks.md | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md new file mode 100644 index 000000000..df1e9d066 --- /dev/null +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -0,0 +1,113 @@ +# What are Application Security Risks? +Attackers can potentially use many different paths through your application to do harm to your business or organization. Each of these ways poses a potential risk that needs to be investigated. + +![Calculation diagram](../assets/2025-algorithm-diagram.png) + + + + + + + + + + + + + + + + + + +
+ Threat Agents + + Attack \ +Vectors + + Exploitability + + Likelihood of Missing Security +

+ + Controls +

+ Technical +

+ + Impacts +

+ Business +

+ + Impacts +

+ By environment, \ +dynamic by situation picture + + By Application exposure (by environment + + Avg Weighted Exploit + + Missing Controls \ +by average Incidence rate \ +Weighed by coverage + + Avg Weighted Impact + + By Business +
+ + +In our Risk Rating we have taken into account the universal parameters of exploitability, average likelihood of missing security controls for a weakness and its technical impacts. + +Each organization is unique, and so are the threat actors for that organization, their goals, and the impact of any breach. If a public interest organization uses a content management system (CMS) for public information and a health system uses that same exact CMS for sensitive health records, the threat actors and business impacts can be very different for the same software. It is critical to understand the risk to your organization based on the exposure of the application, the applicable threat agents by situation picture (for targeted and undirected attacks by business and location) and the individual business impacts. + + +## How the data is used for selecting categories and ranking them + +In 2017, we selected categories by incidence rate to determine likelihood, then ranked them by team discussion based on decades of experience for Exploitability, Detectability (also likelihood), and Technical Impact. For 2021, we used data for Exploitability and (Technical) Impact from the CVSSv2 and CVSSv3 scores in the National Vulnerability Database (NVD). For 2025, we continued the same methodology that we created in 2021. + +We downloaded OWASP Dependency Check and extracted the CVSS Exploit, and Impact scores grouped by related CWEs. It took a fair bit of research and effort as all the CVEs have CVSSv2 scores, but there are flaws in CVSSv2 that CVSSv3 should address. After a certain point in time, all CVEs are assigned a CVSSv3 score as well. Additionally, the scoring ranges and formulas were updated between CVSSv2 and CVSSv3. + +In CVSSv2, both Exploit and (Technical) Impact could be up to 10.0, but the formula would knock them down to 60% for Exploit and 40% for Impact. In CVSSv3, the theoretical max was limited to 6.0 for Exploit and 4.0 for Impact. With the weighting considered, the Impact scoring shifted higher, almost a point and a half on average in CVSSv3, and exploitability moved nearly half a point lower on average when we conducted analysis for the 2021 Top Ten. + +There are approximately 175k records (up from 125k in 2021) of CVEs mapped to CWEs in the National Vulnerability Database (NVD), extracted from OWASP Dependency Check. Additionally, there are 643 unique CWEs mapped to CVEs (up from 241 in 2021). Within the nearly 220k CVEs that were extracted, 160k had CVSS v2 scores, 156k had CVSS v3 scores, and 6k had CVSS v4 scores. Many CVEs have multiple scores, which is why they total more than 220k. + +For the Top Ten 2025, we calculated average exploit and impact scores in the following manner. We grouped all the CVEs with CVSS scores by CWE and weighted both exploit and impact scores by the percentage of the population that had CVSSv3, as well as the remaining population with CVSSv2 scores, to get an overall average. We mapped these averages to the CWEs in the dataset to use as Exploit and (Technical) Impact scoring for the other half of the risk equation. + +Why not use CVSS v4.0, you may ask? That’s because the scoring algorithm was fundamentally changed, and it no longer easily provides the *Exploit* or *Impact* scores as CVSSv2 and CVSSv3 do. We will attempt to figure out a way to use CVSS v4.0 scoring for future versions of the Top Ten, but we were unable to determine a timely way to do so for the 2025 edition. + +For the incidence rate, we calculated the percentage of applications vulnerable to each CWE from the population tested by an org for a period of time. As a reminder, we are not using frequency (or how many times an issue appears in an application), we are interested in what percentage of the population of applications were found to have each CWE. + +For coverage we look at the percentage of applications tested by all organizations for a given CWE. The higher the calculated coverage, the stronger the assurance that the incidence rate is accurate as the sample size is more representative of the population. + +The formula that we used for this iteration is similar to 2021, with some weighting changes: +(Max Incidence Rate % * 1000) + (Max Coverage % * 100) + (Avg Exploit * 10) + (Avg Impact * 20) + (Sum Occurrences / 10000) = Risk Score + +The calculated scores ranged from 621.60 for the category of Broken Access Control to 271.08 for Memory Management Errors. + +This is not a perfect system, but it is valuable for ranking risk categories. + +One additional challenge that is growing is the definition of an "application". As the industry shifts to different architectures that consist of micro-services and other implementations that are smaller than a traditional application, calculations are more difficult. For instance, if an organization is testing code repositories, what does it consider an application? Similar to the growth of CVSSv4, the next edition of the Top Ten may need to adjust the analysis and scoring to account for a constantly changing industry. + +## Data Factors + +There are data factors that are listed for each of the Top Ten Categories, here is what they mean: + +**CWEs Mapped:** The number of CWEs mapped to a category by the Top Ten team. + +**Incidence Rate:** Incidence rate is the percentage of applications vulnerable to that CWE from the population tested by that org for that year. + +**Weighted Exploit:** The Exploit sub-score from CVSSv2 and CVSSv3 scores assigned to CVEs mapped to CWEs, normalized, and placed on a 10pt scale. + +**Weighted Impact:** The Impact sub-score from CVSSv2 and CVSSv3 scores assigned to CVEs mapped to CWEs, normalized, and placed on a 10pt scale. + +**(Testing) Coverage:** The percentage of applications tested by all organizations for a given CWE. + +**Total Occurrences:** Total number of applications found to have the CWEs mapped to a category. + +**Total CVEs:** Total number of CVEs in the NVD DB that were mapped to the CWEs mapped to a category. + +**Formula:** (Max Incidence Rate % * 1000) + (Max Coverage % * 100) + (Avg Exploit * 10) + (Avg Impact * 20) + (Sum Occurrences / 10000) = Risk Score From ee7ee090ea7e35a2bb5d0cbe292abf6cce191d99 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Fri, 26 Dec 2025 14:14:10 +0900 Subject: [PATCH 004/167] =?UTF-8?q?=EB=AC=B8=EC=96=B4=EC=B2=B4->=EA=B5=AC?= =?UTF-8?q?=EC=96=B4=EC=B2=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2025/docs/kr/0x00_2025-Introduction.md | 50 +++++++++++++------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index 2e9f110a0..4d0167dba 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -27,61 +27,61 @@ OWASP Top 10의 8번째 버전을 환영합니다! ## 2025년 Top 10의 변화 -2025년 Top 10에는 두 개의 신규 범주와 하나의 통합이 있습니다. 가능한 한 증상보다는 근본 원인에 초점을 맞추려고 노력했습니다. 소프트웨어 공학과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 범주를 만드는 것은 사실상 불가능합니다. +2025년 Top 10에는 두 개의 신규 범주와 하나의 통합이 포함되어 있다. 가능한 한 증상보다는 근본 원인에 초점을 맞추었다. 소프트웨어 공학과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 범주를 구성하는 것은 사실상 불가능하다. ![Mapping](../assets/2025-mappings.png) -* **[A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지합니다. 제공된 데이터에 따르면 평균적으로 테스트된 애플리케이션의 3.73%가 이 범주의 40개 공통 약점 열거(CWE) 중 하나 이상을 가지고 있었습니다. 위 그림의 점선으로 표시된 것처럼, 서버 측 요청 위조(SSRF)가 이 범주에 통합되었습니다. -* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년의 5위에서 2025년에는 2위로 상승했습니다. 이번 주기의 데이터에서 설정 오류가 더 많이 나타납니다. 테스트된 애플리케이션의 3.00%가 이 범주의 16개 CWE 중 하나 이상을 가지고 있었습니다. 소프트웨어 공학이 구성에 기반한 애플리케이션의 동작을 계속 증가시키고 있기 때문에 이는 놀랍지 않습니다. -* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라의 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 넓은 범위의 침해를 포함합니다. 이 범주는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 투표되었습니다. 이 범주는 5개의 CWE를 포함하며 수집된 데이터에서 제한적으로 나타나지만, 이는 테스트의 어려움 때문이라고 생각하며 이 분야의 테스트가 따라잡기를 희망합니다. 이 범주는 데이터에서 가장 적은 발생 빈도를 보이지만, CVE의 평균 악용 및 영향 점수는 가장 높습니다. -* **[A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했습니다. 제공된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 범주의 32개 CWE 중 하나 이상을 가지고 있습니다. 이 범주는 종종 민감한 데이터 노출이나 시스템 침해로 이어집니다. -* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지합니다. 인젝션은 가장 많이 테스트되는 범주 중 하나이며, 이 범주의 38개 CWE와 연관된 CVE의 수가 가장 많습니다. 인젝션에는 크로스 사이트 스크립팅(높은 빈도/낮은 영향)에서 SQL 인젝션(낮은 빈도/높은 영향) 취약점에 이르기까지 다양한 문제가 포함됩니다. -* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패가 추월하면서 순위에서 4위에서 6위로 두 단계 하락했습니다. 이 범주는 2021년에 도입되었으며, 위협 모델링과 관련하여 업계에서 눈에 띄는 개선과 보안 설계에 대한 더 큰 강조를 보았습니다. -* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 이 범주의 36개 CWE를 더 정확하게 반영하기 위해 약간의 이름 변경(이전에는 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지합니다. 이 범주는 여전히 중요하지만, 인증을 위한 표준화된 프레임워크의 증가된 사용이 인증 실패 발생에 유익한 효과를 미치는 것으로 보입니다. -* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 계속 유지합니다. 이 범주는 신뢰 경계를 유지하고 소프트웨어 공급망 실패보다 낮은 수준에서 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 실패에 초점을 맞춥니다. -* **[A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지합니다. 이 범주는 관련 로깅 이벤트에 대한 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 이름 변경(이전에는 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었습니다. 경고 없이 훌륭한 로깅은 보안 사고를 식별하는 데 최소한의 가치만 있습니다. 이 범주는 항상 데이터에서 과소평가되며, 커뮤니티 설문 조사 참가자들의 투표로 다시 목록의 위치에 올랐습니다. -* **[A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년의 새로운 범주입니다. 이 범주는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 열림 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함합니다. +* **[A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하고 있다. 제공된 데이터에 따르면 평균적으로 테스트된 애플리케이션의 3.73%가 이 범주의 40개 공통 약점 열거(CWE) 중 하나 이상을 포함하고 있었다. 위 그림의 점선으로 표시된 바와 같이, 서버 측 요청 위조(SSRF)가 이 범주에 통합되었다. +* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년의 5위에서 2025년에는 2위로 상승했다. 이번 주기의 데이터에서 설정 오류가 더 많이 나타났다. 테스트된 애플리케이션의 3.00%가 이 범주의 16개 CWE 중 하나 이상을 포함하고 있었다. 소프트웨어 공학에서 구성 기반 애플리케이션 동작이 지속적으로 증가하고 있어 이는 당연한 결과로 보인다. +* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라의 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 광범위한 침해를 포함한다. 이 범주는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 선정되었다. 이 범주는 5개의 CWE를 포함하며 수집된 데이터에서 제한적으로 나타났지만, 이는 테스트의 어려움에 기인한 것으로 판단되며 향후 이 분야의 테스트 방법론이 발전하기를 기대한다. 이 범주는 데이터상 가장 낮은 발생 빈도를 보이지만, CVE의 평균 악용 및 영향 점수는 가장 높다. +* **[A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했다. 제공된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 범주의 32개 CWE 중 하나 이상을 포함하고 있다. 이 범주는 종종 민감한 데이터 노출이나 시스템 침해로 이어진다. +* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지하고 있다. 인젝션은 가장 많이 테스트되는 범주 중 하나이며, 이 범주의 38개 CWE와 연관된 CVE의 수가 가장 많다. 인젝션에는 크로스 사이트 스크립팅(높은 빈도/낮은 영향)에서 SQL 인젝션(낮은 빈도/높은 영향) 취약점에 이르기까지 다양한 문제가 포함된다. +* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 순위가 4위에서 6위로 두 단계 하락했다. 이 범주는 2021년에 도입되었으며, 위협 모델링과 관련하여 업계에서 눈에 띄는 개선이 있었고 보안 설계에 대한 강조도 증가했다. +* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 이 범주의 36개 CWE를 더 정확하게 반영하기 위해 약간의 명칭 변경(이전 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지하고 있다. 이 범주는 여전히 중요하지만, 인증을 위한 표준화된 프레임워크의 사용 증가가 인증 실패 발생에 긍정적 영향을 미치는 것으로 보인다. +* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 유지하고 있다. 이 범주는 신뢰 경계를 유지하고 소프트웨어 공급망 실패보다 낮은 수준에서 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 데 실패하는 경우에 초점을 맞춘다. +* **[A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하고 있다. 이 범주는 관련 로깅 이벤트에 대한 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 명칭 변경(이전 "[보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었다. 경고 기능이 없는 우수한 로깅만으로는 보안 사고를 식별하는 데 최소한의 가치만 제공한다. 이 범주는 데이터상 항상 과소평가되어 왔으며, 커뮤니티 설문 조사 참가자들의 투표를 통해 다시 목록에 포함되었다. +* **[A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년의 신규 범주이다. 이 범주는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 개방(fail-open) 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함한다. ## 방법론 -이번 Top 10 버전은 데이터에 기반하지만, 맹목적으로 데이터에만 의존하지 않습니다. 제공된 데이터를 기반으로 12개 범주의 순위를 매기고, 커뮤니티 설문 조사의 응답에 의해 2개를 승격하거나 강조하도록 허용했습니다. 이를 수행하는 근본적인 이유는 다음과 같습니다. 제공된 데이터를 검토하는 것은 본질적으로 과거를 들여다보는 것입니다. 애플리케이션 보안 연구자들은 새로운 취약점을 식별하고 새로운 테스트 방법을 개발하는 데 시간을 할애합니다. 이러한 테스트를 도구와 프로세스에 통합하는 데는 몇 주에서 몇 년이 걸립니다. 대규모로 약점을 안정적으로 테스트할 수 있을 때까지 몇 년이 지났을 수 있습니다. 또한 안정적으로 테스트할 수 없고 데이터에 나타나지 않을 수 있는 중요한 위험도 있습니다. 그 관점의 균형을 맞추기 위해, 커뮤니티 설문 조사를 사용하여 최전선에 있는 애플리케이션 보안 및 개발 실무자들에게 테스트 데이터에서 과소평가될 수 있는 필수 위험으로 무엇을 보는지 물어봅니다. +이번 Top 10 버전은 데이터에 기반하되, 맹목적으로 데이터에만 의존하지 않았다. 제공된 데이터를 기반으로 12개 범주의 순위를 매기고, 커뮤니티 설문 조사 응답에 따라 2개를 승격하거나 강조했다. 이러한 접근 방식을 채택한 근본적인 이유는 다음과 같다. 제공된 데이터를 검토하는 것은 본질적으로 과거를 되돌아보는 것이다. 애플리케이션 보안 연구자들은 새로운 취약점을 식별하고 새로운 테스트 방법을 개발하는 데 시간을 투자한다. 이러한 테스트를 도구와 프로세스에 통합하는 데는 몇 주에서 몇 년이 소요된다. 대규모로 약점을 안정적으로 테스트할 수 있을 때까지 수년이 걸릴 수 있다. 또한 안정적으로 테스트할 수 없어 데이터에 나타나지 않을 수 있는 중요한 위험도 존재한다. 이러한 관점의 균형을 맞추기 위해, 커뮤니티 설문 조사를 통해 현장의 애플리케이션 보안 및 개발 실무자들에게 테스트 데이터에서 과소평가될 수 있는 필수 위험으로 무엇을 파악하고 있는지 조사했다. ## 범주의 구조화 방법 -몇 가지 범주가 이전 OWASP Top 10에서 변경되었습니다. 다음은 범주 변경 사항의 개괄적인 요약입니다. +몇 가지 범주가 이전 OWASP Top 10에서 변경되었다. 다음은 범주 변경 사항의 개괄적인 요약이다. -이번 반복에서는 2021년 판에서 했던 것처럼 CWE에 대한 제한 없이 데이터를 요청했습니다. 특정 연도(2021년부터 시작)에 테스트된 애플리케이션의 수와 테스트에서 발견된 CWE의 인스턴스가 하나 이상 있는 애플리케이션의 수를 요청했습니다. 이 형식을 통해 애플리케이션 모집단 내에서 각 CWE가 얼마나 널리 퍼져 있는지 추적할 수 있습니다. 우리의 목적상 빈도는 무시합니다. 다른 상황에서는 필요할 수 있지만, 애플리케이션 모집단에서의 실제 확산 정도만 숨길 뿐입니다. 애플리케이션에 CWE의 인스턴스가 4개 있든 4,000개 있든 Top 10 계산의 일부가 아닙니다. 특히 수동 테스터는 애플리케이션에서 반복되는 횟수에 관계없이 취약점을 한 번만 나열하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 취약점의 모든 인스턴스를 고유한 것으로 나열합니다. 2017년에는 약 30개의 CWE에서 2021년에는 거의 400개의 CWE로, 이번 판에서는 데이터 세트에서 분석할 589개의 CWE로 증가했습니다. 향후 보완 자료로 추가 데이터 분석을 수행할 계획입니다. CWE 수의 이러한 상당한 증가는 범주 구조화 방법의 변경을 필요로 합니다. +이번 반복에서는 2021년 판에서와 마찬가지로 CWE에 대한 제한 없이 데이터를 요청했다. 특정 연도(2021년부터 시작)에 테스트된 애플리케이션의 수와 테스트에서 발견된 CWE의 인스턴스가 하나 이상 있는 애플리케이션의 수를 요청했다. 이 형식을 통해 애플리케이션 모집단 내에서 각 CWE가 얼마나 널리 분포되어 있는지 추적할 수 있다. 본 분석의 목적상 빈도는 고려하지 않았다. 다른 상황에서는 필요할 수 있지만, 애플리케이션 모집단에서의 실제 확산 정도를 가릴 뿐이기 때문이다. 애플리케이션에 CWE의 인스턴스가 4개 있든 4,000개 있든 Top 10 계산에는 영향을 미치지 않는다. 특히 수동 테스터는 애플리케이션에서 반복되는 횟수에 관계없이 취약점을 한 번만 나열하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 취약점의 모든 인스턴스를 개별적으로 나열한다. 2017년 약 30개의 CWE에서 2021년 거의 400개의 CWE로, 이번 판에서는 데이터 세트에서 분석할 589개의 CWE로 증가했다. 향후 보완 자료로 추가 데이터 분석을 수행할 계획이다. CWE 수의 이러한 상당한 증가는 범주 구조화 방법의 변경을 필요로 한다. -수개월 동안 CWE를 그룹화하고 범주화하는 데 시간을 보냈으며 추가로 몇 달을 더 계속할 수도 있었습니다. 어느 시점에서 멈춰야 했습니다. CWE에는 근본 원인 유형과 증상 유형이 모두 있으며, 근본 원인 유형은 "암호화 실패" 및 "설정 오류"와 같고 증상 유형은 "민감한 데이터 노출" 및 "서비스 거부"와 같습니다. 식별 및 해결 지침을 제공하는 데 더 논리적이기 때문에 가능한 한 근본 원인에 초점을 맞추기로 결정했습니다. 증상보다 근본 원인에 초점을 맞추는 것은 새로운 개념이 아닙니다. Top 10은 증상과 근본 원인이 혼합되어 있었습니다. CWE도 증상과 근본 원인이 혼합되어 있습니다. 우리는 단순히 이를 더 의도적으로 명시하고 있을 뿐입니다. 이번 판에서는 범주당 평균 25개의 CWE가 있으며, 하한선은 A03:2025-소프트웨어 공급망 실패의 5개 CWE와 A09:2025 보안 로깅 및 경고 실패에서 A01:2025-취약한 접근 통제의 40개 CWE까지입니다. 범주의 CWE 수를 40개로 제한하기로 결정했습니다. 이 업데이트된 범주 구조는 기업이 언어/프레임워크에 적합한 CWE에 집중할 수 있으므로 추가적인 교육 이점을 제공합니다. +수개월 동안 CWE를 그룹화하고 범주화하는 데 시간을 투자했으며 추가로 몇 달을 더 소요할 수도 있었다. 그러나 어느 시점에서 종료해야 했다. CWE에는 근본 원인 유형과 증상 유형이 모두 존재하며, 근본 원인 유형은 "암호화 실패" 및 "설정 오류"와 같고 증상 유형은 "민감한 데이터 노출" 및 "서비스 거부"와 같다. 식별 및 해결 지침을 제공하는 데 더 논리적이기 때문에 가능한 한 근본 원인에 초점을 맞추기로 결정했다. 증상보다 근본 원인에 초점을 맞추는 것은 새로운 개념이 아니다. Top 10은 증상과 근본 원인이 혼합되어 있었다. CWE 역시 증상과 근본 원인이 혼합되어 있다. 본 연구에서는 이를 더 의도적으로 명시하고 있을 뿐이다. 이번 판에서는 범주당 평균 25개의 CWE가 포함되어 있으며, 하한선은 A03:2025-소프트웨어 공급망 실패의 5개 CWE이고 상한선은 A01:2025-취약한 접근 통제의 40개 CWE이다. 범주의 CWE 수를 40개로 제한하기로 결정했다. 이 업데이트된 범주 구조는 기업이 언어/프레임워크에 적합한 CWE에 집중할 수 있어 추가적인 교육적 이점을 제공한다. -MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 Top 10을 10개의 CWE 목록으로 전환하지 않는 이유가 무엇인지 질문을 받았습니다. 범주에서 여러 CWE를 사용하는 주요 이유는 두 가지입니다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아닙니다. 이는 Top 10의 일부가 적용되지 않을 수 있으므로 도구 및 교육/인식 프로그램에 문제를 일으킵니다. 두 번째 이유는 일반적인 취약점에 대해 여러 CWE가 있다는 것입니다. 예를 들어, 일반 인젝션, 명령 인젝션, 크로스 사이트 스크립팅, 하드코딩된 암호, 유효성 검증 부족, 버퍼 오버플로, 민감한 정보의 평문 저장 및 기타 여러 가지에 대해 여러 CWE가 있습니다. 조직이나 테스터에 따라 다른 CWE가 사용될 수 있습니다. 여러 CWE가 있는 범주를 사용함으로써 공통 범주 이름 아래에서 발생할 수 있는 다양한 유형의 약점에 대한 기준과 인식을 높이는 데 도움이 될 수 있습니다. 이번 Top 10 2025 판에서는 10개 범주 내에 248개의 CWE가 있습니다. 이 릴리스 시점에서 [MITRE에서 다운로드할 수 있는 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 있습니다. +MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 Top 10을 10개의 CWE 목록으로 전환하지 않는 이유에 대한 질문을 받았다. 범주에서 여러 CWE를 사용하는 주요 이유는 두 가지이다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이는 Top 10의 일부가 적용되지 않을 수 있어 도구 및 교육/인식 프로그램에 문제를 야기할 수 있다. 두 번째 이유는 일반적인 취약점에 대해 여러 CWE가 존재한다는 것이다. 예를 들어, 일반 인젝션, 명령 인젝션, 크로스 사이트 스크립팅, 하드코딩된 암호, 유효성 검증 부족, 버퍼 오버플로, 민감한 정보의 평문 저장 등에 대해 다양한 CWE가 존재한다. 조직이나 테스터에 따라 다른 CWE가 사용될 수 있다. 여러 CWE가 있는 범주를 사용함으로써 공통 범주 이름 아래에서 발생할 수 있는 다양한 유형의 약점에 대한 기준과 인식을 높이는 데 도움이 된다. 이번 Top 10 2025 판에서는 10개 범주 내에 248개의 CWE가 포함되어 있다. 이 릴리스 시점에서 [MITRE에서 다운로드할 수 있는 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 있다. ## 범주 선택을 위한 데이터 사용 방법 -2021년 판에서 했던 것과 유사하게, *악용 가능성*과 *(기술적) 영향*을 위해 CVE 데이터를 활용했습니다. OWASP Dependency Check를 다운로드하고 CVSS 악용 및 영향 점수를 추출하여 CVE와 함께 나열된 관련 CWE별로 그룹화했습니다. 모든 CVE에는 CVSSv2 점수가 있지만 CVSSv2에는 CVSSv3에서 해결해야 할 결함이 있기 때문에 상당한 연구와 노력이 필요했습니다. 특정 시점 이후에는 모든 CVE에 CVSSv3 점수도 할당됩니다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 공식이 업데이트되었습니다. +2021년 판에서와 유사하게, *악용 가능성*과 *(기술적) 영향*을 위해 CVE 데이터를 활용했다. OWASP Dependency Check를 다운로드하고 CVSS 악용 및 영향 점수를 추출하여 CVE와 함께 나열된 관련 CWE별로 그룹화했다. 모든 CVE에는 CVSSv2 점수가 있지만 CVSSv2에는 CVSSv3에서 해결해야 할 결함이 있기 때문에 상당한 연구와 노력이 필요했다. 특정 시점 이후에는 모든 CVE에 CVSSv3 점수도 할당된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 공식이 업데이트되었다. -CVSSv2에서는 악용 가능성과 (기술적) 영향이 모두 최대 10.0까지 가능했지만, 공식이 악용 가능성은 60%, 영향은 40%로 낮췄습니다. CVSSv3에서는 이론적 최댓값이 악용 가능성은 6.0, 영향은 4.0으로 제한되었습니다. 가중치를 고려할 때, 영향 점수는 CVSSv3에서 평균 거의 1.5점 더 높게 이동했고 악용 가능성은 평균 거의 0.5점 더 낮게 이동했습니다. +CVSSv2에서는 악용 가능성과 (기술적) 영향이 모두 최대 10.0까지 가능했지만, 공식상 악용 가능성은 60%, 영향은 40%로 감소했다. CVSSv3에서는 이론적 최댓값이 악용 가능성은 6.0, 영향은 4.0으로 제한되었다. 가중치를 고려할 때, 영향 점수는 CVSSv3에서 평균 약 1.5점 상승했고 악용 가능성은 평균 약 0.5점 하락했다. -NVD(National Vulnerability Database)에서 CWE에 매핑된 약 175,000개의 CVE 레코드(2021년의 125,000개에서 증가)가 OWASP Dependency Check에서 추출되었습니다. 또한 CVE에 매핑된 643개의 고유한 CWE가 있습니다(2021년의 241개에서 증가). 추출된 거의 220,000개의 CVE 중에서 160,000개는 CVSS v2 점수를, 156,000개는 CVSS v3 점수를, 6,000개는 CVSS v4 점수를 가지고 있었습니다. 많은 CVE가 여러 점수를 가지고 있기 때문에 합계가 220,000개를 초과합니다. +NVD(National Vulnerability Database)에서 CWE에 매핑된 약 175,000개의 CVE 레코드(2021년의 125,000개에서 증가)가 OWASP Dependency Check에서 추출되었다. 또한 CVE에 매핑된 643개의 고유한 CWE가 있다(2021년의 241개에서 증가). 추출된 약 220,000개의 CVE 중에서 160,000개는 CVSS v2 점수를, 156,000개는 CVSS v3 점수를, 6,000개는 CVSS v4 점수를 보유하고 있었다. 많은 CVE가 여러 점수를 보유하고 있기 때문에 합계가 220,000개를 초과한다. -Top 10 2025의 경우, 다음과 같은 방식으로 평균 악용 및 영향 점수를 계산했습니다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3를 가진 모집단의 비율과 CVSSv2 점수를 가진 나머지 모집단으로 악용 및 영향 점수를 가중하여 전체 평균을 얻었습니다. 이러한 평균을 데이터 세트의 CWE에 매핑하여 위험 방정식의 나머지 절반에 대한 악용 및 (기술적) 영향 점수로 사용했습니다. +Top 10 2025의 경우, 다음과 같은 방식으로 평균 악용 및 영향 점수를 계산했다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3를 가진 모집단의 비율과 CVSSv2 점수를 가진 나머지 모집단으로 악용 및 영향 점수를 가중하여 전체 평균을 산출했다. 이러한 평균을 데이터 세트의 CWE에 매핑하여 위험 방정식의 나머지 절반에 대한 악용 및 (기술적) 영향 점수로 사용했다. -CVSS v4.0을 사용하지 않는 이유가 궁금할 수 있습니다. 이는 점수 알고리즘이 근본적으로 변경되었고, CVSS v2 및 CVSSv3처럼 *악용* 또는 *영향* 점수를 더 이상 쉽게 제공하지 않기 때문입니다. 향후 버전의 Top 10에 CVSS v4.0 점수를 사용하는 방법을 파악하려고 시도할 것이지만, 2025년 판에는 적시에 그렇게 할 방법을 결정할 수 없었습니다. +CVSS v4.0을 사용하지 않는 이유가 궁금할 수 있다. 이는 점수 알고리즘이 근본적으로 변경되었고, CVSS v2 및 CVSSv3처럼 *악용* 또는 *영향* 점수를 더 이상 쉽게 제공하지 않기 때문이다. 향후 버전의 Top 10에 CVSS v4.0 점수를 사용하는 방법을 파악하려고 시도할 것이지만, 2025년 판에는 적시에 그러한 방법을 결정할 수 없었다. ## 커뮤니티 설문 조사를 사용하는 이유 -데이터의 결과는 대부분 업계에서 자동화된 방식으로 테스트할 수 있는 것으로 제한됩니다. 숙련된 애플리케이션 보안 전문가와 대화하면, 그들이 발견하는 것과 아직 데이터에 없는 추세에 대해 이야기할 것입니다. 사람들이 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 걸리고, 그 테스트가 자동화되어 대규모 애플리케이션 모집단에 대해 실행되는 데 더 많은 시간이 걸립니다. 우리가 발견하는 모든 것은 과거를 되돌아보는 것이며, 데이터에 나타나지 않는 작년의 추세를 놓칠 수 있습니다. +데이터의 결과는 대부분 업계에서 자동화된 방식으로 테스트할 수 있는 것으로 제한된다. 숙련된 애플리케이션 보안 전문가와 대화하면, 그들이 발견한 사실과 아직 데이터에 반영되지 않은 추세에 대해 들을 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되고, 그 테스트가 자동화되어 대규모 애플리케이션 모집단에 대해 실행되는 데 더 많은 시간이 걸린다. 우리가 발견하는 모든 것은 과거를 되돌아보는 것이며, 데이터에 나타나지 않는 작년의 추세를 놓칠 수 있다. -따라서 우리는 데이터에서 10개 범주 중 8개만 선택합니다. 왜냐하면 불완전하기 때문입니다. 나머지 두 범주는 Top 10 커뮤니티 설문 조사에서 나옵니다. 이를 통해 최전선의 실무자들이 데이터에 없고 (데이터로 표현되지 않을 수도 있는) 가장 높은 위험으로 보는 것에 투표할 수 있습니다. +따라서 데이터에서 10개 범주 중 8개만 선택한다. 데이터가 불완전하기 때문이다. 나머지 두 범주는 Top 10 커뮤니티 설문 조사에서 도출된다. 이를 통해 현장 실무자들이 데이터에 없고 (데이터로 표현되지 않을 수도 있는) 가장 높은 위험으로 인식하는 것에 투표할 수 있다. ## 데이터 제공자에게 감사드립니다 -다음 조직들이 (여러 익명 기부자와 함께) 280만 개 이상의 애플리케이션에 대한 데이터를 제공하여 이것이 가장 크고 포괄적인 애플리케이션 보안 데이터 세트가 되도록 도와주었습니다. 여러분 없이는 이것이 불가능했을 것입니다. +다음 조직들이 (여러 익명 기여자와 함께) 280만 개 이상의 애플리케이션에 대한 데이터를 제공하여 이것이 가장 크고 포괄적인 애플리케이션 보안 데이터 세트가 되도록 기여 했습니다. 이들의 도움 없이는 이 작업이 불가능했을 것 입니다. * Accenture (Prague) * Anonymous (multiple) @@ -111,5 +111,3 @@ CVSS v4.0을 사용하지 않는 이유가 궁금할 수 있습니다. 이는 ### 프로젝트 링크: * [홈페이지](https://owasp.org/www-project-top-ten/) * [GitHub 저장소](https://github.com/OWASP/Top10) - - From df1092af51398418b2f41744e3ad0b583a901fd0 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Fri, 26 Dec 2025 15:04:54 +0900 Subject: [PATCH 005/167] Apply formal Korean style with natural expressions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use English for technical terms (CWE, CVE, CVSS, etc.) - Standardize acronym format to "ACRONYM(Full Name)" - Replace "범주" with "카테고리" throughout --- 2025/docs/kr/0x00_2025-Introduction.md | 50 +++++++++++++------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index 4d0167dba..45d54f290 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -27,41 +27,41 @@ OWASP Top 10의 8번째 버전을 환영합니다! ## 2025년 Top 10의 변화 -2025년 Top 10에는 두 개의 신규 범주와 하나의 통합이 포함되어 있다. 가능한 한 증상보다는 근본 원인에 초점을 맞추었다. 소프트웨어 공학과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 범주를 구성하는 것은 사실상 불가능하다. +2025년 Top 10에는 두 개의 신규 카테고리와 하나의 통합이 포함되어 있다. 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 공학과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 카테고리를 구성하는 것은 사실상 불가능하다. ![Mapping](../assets/2025-mappings.png) -* **[A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하고 있다. 제공된 데이터에 따르면 평균적으로 테스트된 애플리케이션의 3.73%가 이 범주의 40개 공통 약점 열거(CWE) 중 하나 이상을 포함하고 있었다. 위 그림의 점선으로 표시된 바와 같이, 서버 측 요청 위조(SSRF)가 이 범주에 통합되었다. -* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년의 5위에서 2025년에는 2위로 상승했다. 이번 주기의 데이터에서 설정 오류가 더 많이 나타났다. 테스트된 애플리케이션의 3.00%가 이 범주의 16개 CWE 중 하나 이상을 포함하고 있었다. 소프트웨어 공학에서 구성 기반 애플리케이션 동작이 지속적으로 증가하고 있어 이는 당연한 결과로 보인다. -* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라의 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 광범위한 침해를 포함한다. 이 범주는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 선정되었다. 이 범주는 5개의 CWE를 포함하며 수집된 데이터에서 제한적으로 나타났지만, 이는 테스트의 어려움에 기인한 것으로 판단되며 향후 이 분야의 테스트 방법론이 발전하기를 기대한다. 이 범주는 데이터상 가장 낮은 발생 빈도를 보이지만, CVE의 평균 악용 및 영향 점수는 가장 높다. -* **[A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했다. 제공된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 범주의 32개 CWE 중 하나 이상을 포함하고 있다. 이 범주는 종종 민감한 데이터 노출이나 시스템 침해로 이어진다. -* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지하고 있다. 인젝션은 가장 많이 테스트되는 범주 중 하나이며, 이 범주의 38개 CWE와 연관된 CVE의 수가 가장 많다. 인젝션에는 크로스 사이트 스크립팅(높은 빈도/낮은 영향)에서 SQL 인젝션(낮은 빈도/높은 영향) 취약점에 이르기까지 다양한 문제가 포함된다. -* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 순위가 4위에서 6위로 두 단계 하락했다. 이 범주는 2021년에 도입되었으며, 위협 모델링과 관련하여 업계에서 눈에 띄는 개선이 있었고 보안 설계에 대한 강조도 증가했다. -* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 이 범주의 36개 CWE를 더 정확하게 반영하기 위해 약간의 명칭 변경(이전 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지하고 있다. 이 범주는 여전히 중요하지만, 인증을 위한 표준화된 프레임워크의 사용 증가가 인증 실패 발생에 긍정적 영향을 미치는 것으로 보인다. -* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 유지하고 있다. 이 범주는 신뢰 경계를 유지하고 소프트웨어 공급망 실패보다 낮은 수준에서 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 데 실패하는 경우에 초점을 맞춘다. -* **[A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하고 있다. 이 범주는 관련 로깅 이벤트에 대한 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 명칭 변경(이전 "[보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었다. 경고 기능이 없는 우수한 로깅만으로는 보안 사고를 식별하는 데 최소한의 가치만 제공한다. 이 범주는 데이터상 항상 과소평가되어 왔으며, 커뮤니티 설문 조사 참가자들의 투표를 통해 다시 목록에 포함되었다. -* **[A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년의 신규 범주이다. 이 범주는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 개방(fail-open) 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함한다. +* **[A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지한다. 제공된 데이터에 따르면 평균적으로 테스트된 애플리케이션의 3.73%가 이 카테고리의 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 포함한다. 위 그림의 점선으로 표시된 바와 같이, SSRF(Server-Side Request Forgery)가 이 카테고리에 통합되었다. +* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년의 5위에서 2025년에는 2위로 상승했다. 이번 주기의 데이터에서 설정 오류가 더 많이 나타났다. 테스트된 애플리케이션의 3.00%가 이 카테고리의 16개 CWE 중 하나 이상을 포함한다. 소프트웨어 공학에서 구성 기반 애플리케이션 동작이 지속적으로 증가하고 있어 이는 예상된 결과이다. +* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라의 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 광범위한 침해를 포함한다. 이 카테고리는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 선정되었다. 이 카테고리는 5개의 CWE를 포함하며 수집된 데이터에서 제한적으로 나타났는데, 이는 테스트의 어려움에 기인한 것으로 판단되며 향후 이 분야의 테스트 방법론이 발전하기를 기대한다. 이 카테고리는 데이터상 가장 낮은 발생 빈도를 보이지만, CVE(Common Vulnerabilities and Exposures)의 평균 악용 및 영향 점수는 가장 높다. +* **[A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했다. 제공된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 카테고리의 32개 CWE 중 하나 이상을 포함한다. 이 카테고리는 종종 민감한 데이터 노출이나 시스템 침해로 이어진다. +* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지한다. 인젝션은 가장 많이 테스트되는 카테고리 중 하나이며, 이 카테고리의 38개 CWE와 연관된 CVE의 수가 가장 많다. 인젝션에는 Cross-Site Scripting(XSS, 높은 빈도/낮은 영향)에서 SQL Injection(낮은 빈도/높은 영향) 취약점에 이르기까지 다양한 문제가 포함된다. +* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 순위가 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 위협 모델링과 관련하여 업계에서 눈에 띄는 개선이 있었고 보안 설계에 대한 강조도 증가했다. +* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 이 카테고리의 36개 CWE를 더 정확하게 반영하기 위해 약간의 명칭 변경(이전 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지한다. 이 카테고리는 여전히 중요하지만, 인증을 위한 표준화된 프레임워크의 사용 증가가 인증 실패 발생에 긍정적 영향을 미치고 있다. +* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 유지한다. 이 카테고리는 신뢰 경계를 유지하고 소프트웨어 공급망 실패보다 낮은 수준에서 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 데 실패하는 경우에 초점을 둔다. +* **[A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지한다. 이 카테고리는 관련 로깅 이벤트에 대한 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 명칭 변경(이전 "[보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었다. 경고 기능이 없는 우수한 로깅만으로는 보안 사고를 식별하는 데 최소한의 가치만 제공한다. 이 카테고리는 데이터상 항상 과소평가되어 왔으며, 커뮤니티 설문 조사 참가자들의 투표를 통해 다시 목록에 포함되었다. +* **[A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년의 신규 카테고리이다. 이 카테고리는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 개방(fail-open) 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함한다. ## 방법론 -이번 Top 10 버전은 데이터에 기반하되, 맹목적으로 데이터에만 의존하지 않았다. 제공된 데이터를 기반으로 12개 범주의 순위를 매기고, 커뮤니티 설문 조사 응답에 따라 2개를 승격하거나 강조했다. 이러한 접근 방식을 채택한 근본적인 이유는 다음과 같다. 제공된 데이터를 검토하는 것은 본질적으로 과거를 되돌아보는 것이다. 애플리케이션 보안 연구자들은 새로운 취약점을 식별하고 새로운 테스트 방법을 개발하는 데 시간을 투자한다. 이러한 테스트를 도구와 프로세스에 통합하는 데는 몇 주에서 몇 년이 소요된다. 대규모로 약점을 안정적으로 테스트할 수 있을 때까지 수년이 걸릴 수 있다. 또한 안정적으로 테스트할 수 없어 데이터에 나타나지 않을 수 있는 중요한 위험도 존재한다. 이러한 관점의 균형을 맞추기 위해, 커뮤니티 설문 조사를 통해 현장의 애플리케이션 보안 및 개발 실무자들에게 테스트 데이터에서 과소평가될 수 있는 필수 위험으로 무엇을 파악하고 있는지 조사했다. +이번 Top 10 버전은 데이터에 기반하되, 맹목적으로 데이터에만 의존하지 않았다. 제공된 데이터를 기반으로 12개 카테고리의 순위를 매기고, 커뮤니티 설문 조사 응답에 따라 2개를 승격하거나 강조했다. 이러한 접근 방식을 채택한 근본적인 이유는 다음과 같다. 제공된 데이터를 검토하는 것은 본질적으로 과거를 되돌아보는 것이다. 애플리케이션 보안 연구자들은 새로운 취약점을 식별하고 새로운 테스트 방법을 개발하는 데 시간을 투자한다. 이러한 테스트를 도구와 프로세스에 통합하는 데는 몇 주에서 몇 년이 소요된다. 대규모로 약점을 안정적으로 테스트할 수 있을 때까지 수년이 걸릴 수 있다. 또한 안정적으로 테스트할 수 없어 데이터에 나타나지 않을 수 있는 중요한 위험도 존재한다. 이러한 관점의 균형을 맞추기 위해, 커뮤니티 설문 조사를 통해 현장의 애플리케이션 보안 및 개발 실무자들에게 테스트 데이터에서 과소평가될 수 있는 필수 위험으로 무엇을 파악하고 있는지 조사했다. -## 범주의 구조화 방법 +## 카테고리의 구조화 방법 -몇 가지 범주가 이전 OWASP Top 10에서 변경되었다. 다음은 범주 변경 사항의 개괄적인 요약이다. +몇 가지 카테고리가 이전 OWASP Top 10에서 변경되었다. 다음은 카테고리 변경 사항의 개괄적인 요약이다. -이번 반복에서는 2021년 판에서와 마찬가지로 CWE에 대한 제한 없이 데이터를 요청했다. 특정 연도(2021년부터 시작)에 테스트된 애플리케이션의 수와 테스트에서 발견된 CWE의 인스턴스가 하나 이상 있는 애플리케이션의 수를 요청했다. 이 형식을 통해 애플리케이션 모집단 내에서 각 CWE가 얼마나 널리 분포되어 있는지 추적할 수 있다. 본 분석의 목적상 빈도는 고려하지 않았다. 다른 상황에서는 필요할 수 있지만, 애플리케이션 모집단에서의 실제 확산 정도를 가릴 뿐이기 때문이다. 애플리케이션에 CWE의 인스턴스가 4개 있든 4,000개 있든 Top 10 계산에는 영향을 미치지 않는다. 특히 수동 테스터는 애플리케이션에서 반복되는 횟수에 관계없이 취약점을 한 번만 나열하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 취약점의 모든 인스턴스를 개별적으로 나열한다. 2017년 약 30개의 CWE에서 2021년 거의 400개의 CWE로, 이번 판에서는 데이터 세트에서 분석할 589개의 CWE로 증가했다. 향후 보완 자료로 추가 데이터 분석을 수행할 계획이다. CWE 수의 이러한 상당한 증가는 범주 구조화 방법의 변경을 필요로 한다. +이번 반복에서는 2021년 판에서와 마찬가지로 CWE에 대한 제한 없이 데이터를 요청했다. 특정 연도(2021년부터 시작)에 테스트된 애플리케이션의 수와 테스트에서 발견된 CWE의 인스턴스가 하나 이상 있는 애플리케이션의 수를 요청했다. 이 형식을 통해 애플리케이션 모집단 내에서 각 CWE가 얼마나 널리 분포되어 있는지 추적할 수 있다. 본 분석의 목적상 빈도는 고려하지 않았다. 다른 상황에서는 필요할 수 있지만, 애플리케이션 모집단에서의 실제 확산 정도를 가릴 뿐이기 때문이다. 애플리케이션에 CWE의 인스턴스가 4개 있든 4,000개 있든 Top 10 계산에는 영향을 미치지 않는다. 특히 수동 테스터는 애플리케이션에서 반복되는 횟수에 관계없이 취약점을 한 번만 나열하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 취약점의 모든 인스턴스를 개별적으로 나열한다. 2017년 약 30개의 CWE에서 2021년 거의 400개의 CWE로, 이번 판에서는 데이터 세트에서 분석할 589개의 CWE로 증가했다. 향후 보완 자료로 추가 데이터 분석을 수행할 계획이다. CWE 수의 이러한 상당한 증가는 카테고리 구조화 방법의 변경을 필요로 한다. -수개월 동안 CWE를 그룹화하고 범주화하는 데 시간을 투자했으며 추가로 몇 달을 더 소요할 수도 있었다. 그러나 어느 시점에서 종료해야 했다. CWE에는 근본 원인 유형과 증상 유형이 모두 존재하며, 근본 원인 유형은 "암호화 실패" 및 "설정 오류"와 같고 증상 유형은 "민감한 데이터 노출" 및 "서비스 거부"와 같다. 식별 및 해결 지침을 제공하는 데 더 논리적이기 때문에 가능한 한 근본 원인에 초점을 맞추기로 결정했다. 증상보다 근본 원인에 초점을 맞추는 것은 새로운 개념이 아니다. Top 10은 증상과 근본 원인이 혼합되어 있었다. CWE 역시 증상과 근본 원인이 혼합되어 있다. 본 연구에서는 이를 더 의도적으로 명시하고 있을 뿐이다. 이번 판에서는 범주당 평균 25개의 CWE가 포함되어 있으며, 하한선은 A03:2025-소프트웨어 공급망 실패의 5개 CWE이고 상한선은 A01:2025-취약한 접근 통제의 40개 CWE이다. 범주의 CWE 수를 40개로 제한하기로 결정했다. 이 업데이트된 범주 구조는 기업이 언어/프레임워크에 적합한 CWE에 집중할 수 있어 추가적인 교육적 이점을 제공한다. +수개월 동안 CWE를 그룹화하고 카테고리화하는 데 시간을 투자했으며 추가로 몇 달을 더 소요할 수도 있었다. 그러나 어느 시점에서 종료해야 했다. CWE에는 근본 원인 유형과 증상 유형이 모두 존재하며, 근본 원인 유형은 "암호화 실패" 및 "설정 오류"와 같고 증상 유형은 "민감한 데이터 노출" 및 "서비스 거부"와 같다. 식별 및 해결 지침을 제공하는 데 더 논리적이기 때문에 가능한 한 근본 원인에 초점을 맞추기로 결정했다. 증상보다 근본 원인에 초점을 맞추는 것은 새로운 개념이 아니다. Top 10은 증상과 근본 원인이 혼합되어 있었다. CWE 역시 증상과 근본 원인이 혼합되어 있다. 본 연구에서는 이를 더 의도적으로 명시하고 있을 뿐이다. 이번 판에서는 카테고리당 평균 25개의 CWE가 포함되어 있으며, 하한선은 A03:2025-소프트웨어 공급망 실패의 5개 CWE이고 상한선은 A01:2025-취약한 접근 통제의 40개 CWE이다. 카테고리의 CWE 수를 40개로 제한하기로 결정했다. 이 업데이트된 카테고리 구조는 기업이 언어/프레임워크에 적합한 CWE에 집중할 수 있어 추가적인 교육적 이점을 제공한다. -MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 Top 10을 10개의 CWE 목록으로 전환하지 않는 이유에 대한 질문을 받았다. 범주에서 여러 CWE를 사용하는 주요 이유는 두 가지이다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이는 Top 10의 일부가 적용되지 않을 수 있어 도구 및 교육/인식 프로그램에 문제를 야기할 수 있다. 두 번째 이유는 일반적인 취약점에 대해 여러 CWE가 존재한다는 것이다. 예를 들어, 일반 인젝션, 명령 인젝션, 크로스 사이트 스크립팅, 하드코딩된 암호, 유효성 검증 부족, 버퍼 오버플로, 민감한 정보의 평문 저장 등에 대해 다양한 CWE가 존재한다. 조직이나 테스터에 따라 다른 CWE가 사용될 수 있다. 여러 CWE가 있는 범주를 사용함으로써 공통 범주 이름 아래에서 발생할 수 있는 다양한 유형의 약점에 대한 기준과 인식을 높이는 데 도움이 된다. 이번 Top 10 2025 판에서는 10개 범주 내에 248개의 CWE가 포함되어 있다. 이 릴리스 시점에서 [MITRE에서 다운로드할 수 있는 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 있다. +MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 Top 10을 10개의 CWE 목록으로 전환하지 않는 이유에 대한 질문을 받았다. 카테고리에서 여러 CWE를 사용하는 주요 이유는 두 가지이다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이는 Top 10의 일부가 적용되지 않을 수 있어 도구 및 교육/인식 프로그램에 문제를 야기할 수 있다. 두 번째 이유는 일반적인 취약점에 대해 여러 CWE가 존재한다는 것이다. 예를 들어, 일반 인젝션, 명령 인젝션, 크로스 사이트 스크립팅, 하드코딩된 암호, 유효성 검증 부족, 버퍼 오버플로, 민감한 정보의 평문 저장 등에 대해 다양한 CWE가 존재한다. 조직이나 테스터에 따라 다른 CWE가 사용될 수 있다. 여러 CWE가 있는 카테고리를 사용함으로써 공통 카테고리 이름 아래에서 발생할 수 있는 다양한 유형의 약점에 대한 기준과 인식을 높이는 데 도움이 된다. 이번 Top 10 2025 판에서는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 이 릴리스 시점에서 [MITRE에서 다운로드할 수 있는 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 있다. -## 범주 선택을 위한 데이터 사용 방법 +## 카테고리 선택을 위한 데이터 사용 방법 -2021년 판에서와 유사하게, *악용 가능성*과 *(기술적) 영향*을 위해 CVE 데이터를 활용했다. OWASP Dependency Check를 다운로드하고 CVSS 악용 및 영향 점수를 추출하여 CVE와 함께 나열된 관련 CWE별로 그룹화했다. 모든 CVE에는 CVSSv2 점수가 있지만 CVSSv2에는 CVSSv3에서 해결해야 할 결함이 있기 때문에 상당한 연구와 노력이 필요했다. 특정 시점 이후에는 모든 CVE에 CVSSv3 점수도 할당된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 공식이 업데이트되었다. +2021년 판에서와 유사하게, *악용 가능성*과 *(기술적) 영향*을 위해 CVE 데이터를 활용했다. OWASP Dependency Check를 다운로드하고 CVSS(Common Vulnerability Scoring System) 악용 및 영향 점수를 추출하여 CVE와 함께 나열된 관련 CWE별로 그룹화했다. 모든 CVE에는 CVSSv2 점수가 있지만 CVSSv2에는 CVSSv3에서 해결해야 할 결함이 있기 때문에 상당한 연구와 노력이 필요했다. 특정 시점 이후에는 모든 CVE에 CVSSv3 점수도 할당된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 공식이 업데이트되었다. CVSSv2에서는 악용 가능성과 (기술적) 영향이 모두 최대 10.0까지 가능했지만, 공식상 악용 가능성은 60%, 영향은 40%로 감소했다. CVSSv3에서는 이론적 최댓값이 악용 가능성은 6.0, 영향은 4.0으로 제한되었다. 가중치를 고려할 때, 영향 점수는 CVSSv3에서 평균 약 1.5점 상승했고 악용 가능성은 평균 약 0.5점 하락했다. @@ -69,19 +69,19 @@ NVD(National Vulnerability Database)에서 CWE에 매핑된 약 175,000개의 CV Top 10 2025의 경우, 다음과 같은 방식으로 평균 악용 및 영향 점수를 계산했다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3를 가진 모집단의 비율과 CVSSv2 점수를 가진 나머지 모집단으로 악용 및 영향 점수를 가중하여 전체 평균을 산출했다. 이러한 평균을 데이터 세트의 CWE에 매핑하여 위험 방정식의 나머지 절반에 대한 악용 및 (기술적) 영향 점수로 사용했다. -CVSS v4.0을 사용하지 않는 이유가 궁금할 수 있다. 이는 점수 알고리즘이 근본적으로 변경되었고, CVSS v2 및 CVSSv3처럼 *악용* 또는 *영향* 점수를 더 이상 쉽게 제공하지 않기 때문이다. 향후 버전의 Top 10에 CVSS v4.0 점수를 사용하는 방법을 파악하려고 시도할 것이지만, 2025년 판에는 적시에 그러한 방법을 결정할 수 없었다. +CVSS v4.0을 사용하지 않는 이유가 궁금할 수 있다. 이는 점수 알고리즘이 근본적으로 변경되었고, CVSS v2 및 CVSSv3처럼 *악용* 또는 *영향* 점수를 더 이상 쉽게 제공하지 않기 때문이다. 향후 버전의 Top 10에서는 CVSS v4.0 점수를 활용하는 방법을 모색할 예정이나, 2025년 판에서는 적시에 이를 반영하지 못했다. ## 커뮤니티 설문 조사를 사용하는 이유 데이터의 결과는 대부분 업계에서 자동화된 방식으로 테스트할 수 있는 것으로 제한된다. 숙련된 애플리케이션 보안 전문가와 대화하면, 그들이 발견한 사실과 아직 데이터에 반영되지 않은 추세에 대해 들을 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되고, 그 테스트가 자동화되어 대규모 애플리케이션 모집단에 대해 실행되는 데 더 많은 시간이 걸린다. 우리가 발견하는 모든 것은 과거를 되돌아보는 것이며, 데이터에 나타나지 않는 작년의 추세를 놓칠 수 있다. -따라서 데이터에서 10개 범주 중 8개만 선택한다. 데이터가 불완전하기 때문이다. 나머지 두 범주는 Top 10 커뮤니티 설문 조사에서 도출된다. 이를 통해 현장 실무자들이 데이터에 없고 (데이터로 표현되지 않을 수도 있는) 가장 높은 위험으로 인식하는 것에 투표할 수 있다. +따라서 데이터에서 10개 카테고리 중 8개만 선택한다. 데이터가 불완전하기 때문이다. 나머지 두 카테고리는 Top 10 커뮤니티 설문 조사에서 도출된다. 이를 통해 현장 실무자들이 데이터에 없고 (데이터로 표현되지 않을 수도 있는) 가장 높은 위험으로 인식하는 것에 투표할 수 있다. -## 데이터 제공자에게 감사드립니다 +## 데이터 제공자에게 감사를 전한다 -다음 조직들이 (여러 익명 기여자와 함께) 280만 개 이상의 애플리케이션에 대한 데이터를 제공하여 이것이 가장 크고 포괄적인 애플리케이션 보안 데이터 세트가 되도록 기여 했습니다. 이들의 도움 없이는 이 작업이 불가능했을 것 입니다. +다음 조직들이 (여러 익명 기여자와 함께) 280만 개 이상의 애플리케이션에 대한 데이터를 제공하여 이것이 가장 크고 포괄적인 애플리케이션 보안 데이터 세트가 되도록 기여했다. 이들의 협력과 지원이 없었다면 이 프로젝트는 불가능했을 것이다. * Accenture (Prague) * Anonymous (multiple) @@ -106,8 +106,10 @@ CVSS v4.0을 사용하지 않는 이유가 궁금할 수 있다. 이는 점수 ## 이슈 및 풀 리퀘스트 제출 -수정 사항이나 이슈를 제출해 주시기 바랍니다. +수정 사항이나 이슈는 언제든지 제출할 수 있다. ### 프로젝트 링크: * [홈페이지](https://owasp.org/www-project-top-ten/) * [GitHub 저장소](https://github.com/OWASP/Top10) + + From 75acb447b6964131ebf2186c02b88e7951e54a68 Mon Sep 17 00:00:00 2001 From: ni5am Date: Fri, 26 Dec 2025 16:47:10 +0900 Subject: [PATCH 006/167] Add copied 0x01 file --- 2025/docs/ko/0x01_2025-About_OWASP.md | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 2025/docs/ko/0x01_2025-About_OWASP.md diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md new file mode 100644 index 000000000..a4103e922 --- /dev/null +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -0,0 +1,35 @@ +# About OWASP + +The Open Worldwide Application Security Project (OWASP) is an open community dedicated to enabling organizations to develop, purchase, and maintain applications and APIs that can be trusted. + +At OWASP, you'll find free and open: + +- Application security tools and standards +- Cutting edge research +- Standard security controls and libraries +- Complete books on application security testing, secure code development, and secure code review +- Presentations and [videos](https://www.youtube.com/user/OWASPGLOBAL) +- [Cheat sheets](https://cheatsheetseries.owasp.org/) on many common topics +- [Chapters meetings](https://owasp.org/chapters/) held worldwide and online +- [Events, training, and conferences](https://owasp.org/events/). +- [Google Groups](https://groups.google.com/g/owasp) + +Learn more at: [https://owasp.org](https://owasp.org). + +All OWASP tools, documents, videos, presentations, and chapters are free and open to anyone interested in improving application security. + +We advocate approaching application security as a people, process, and technology problem, because the most effective approaches to application security require improvements in all these areas. + +OWASP is a different kind of organization. Our freedom from commercial pressures allows us to provide unbiased, practical, and cost-effective information about application security. + +OWASP is not affiliated with any technology company, although we support the informed use of commercial security technology. OWASP produces many types of materials in a collaborative, transparent, and open way. + +The OWASP Foundation is the non-profit entity that ensures the project's long-term success. Almost everyone associated with OWASP is a volunteer, including the OWASP board, chapter leaders, project leaders, and project members. We support innovative security research with grants and infrastructure. + +Join us! + +## Copyright and License + +![License](../assets/license.png) + +Copyright © 2003-2025 The OWASP® Foundation, Inc. This document is released under the Creative Commons Attribution Share-Alike 4.0 license. For any reuse or distribution, you must make it clear to others the license terms of this work. From 20f4818278c0200e815ad4dbe4aa86c139611b15 Mon Sep 17 00:00:00 2001 From: ni5am Date: Fri, 26 Dec 2025 17:38:28 +0900 Subject: [PATCH 007/167] Translate the About OWASP section in Korean --- 2025/docs/ko/0x01_2025-About_OWASP.md | 40 +++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index a4103e922..d5b4855be 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -1,35 +1,35 @@ -# About OWASP +# OWASP 소개 -The Open Worldwide Application Security Project (OWASP) is an open community dedicated to enabling organizations to develop, purchase, and maintain applications and APIs that can be trusted. +오픈 월드와이드 애플리케이션 보안 프로젝트(Open Worldwide Application Security Project, OWASP, 오와스프)는 각 조직이 신뢰할 수 있는 애플리케이션과 API를 개발, 도입, 유지할 수 있도록 지원하는 오픈 커뮤니티이다. -At OWASP, you'll find free and open: +OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있다. -- Application security tools and standards -- Cutting edge research -- Standard security controls and libraries -- Complete books on application security testing, secure code development, and secure code review -- Presentations and [videos](https://www.youtube.com/user/OWASPGLOBAL) -- [Cheat sheets](https://cheatsheetseries.owasp.org/) on many common topics -- [Chapters meetings](https://owasp.org/chapters/) held worldwide and online -- [Events, training, and conferences](https://owasp.org/events/). +- 애플리케이션 보안 도구 및 표준 +- 선도적인 연구 +- 표준 보안통제 항목 및 라이브러리 +- 애플리케이션 보안 테스팅, 보안 코드 개발, 보안 코드 리뷰에 관한 서적적 +- 프레젠테이션 및 [동영상](https://www.youtube.com/user/OWASPGLOBAL) +- 다양한 주제의 보안 [치트 시트](https://cheatsheetseries.owasp.org/) +- 전 세계 및 온라인에서 개최되는 [챕터 모임](https://owasp.org/chapters/) +- [이벤트, 교육 및 컨퍼런스](https://owasp.org/events/) - [Google Groups](https://groups.google.com/g/owasp) -Learn more at: [https://owasp.org](https://owasp.org). +자세한 내용은 [https://owasp.org](https://owasp.org)에서 확인할 수 있다. -All OWASP tools, documents, videos, presentations, and chapters are free and open to anyone interested in improving application security. +OWASP의 모든 도구, 문서, 동영상, 프레젠테이션을 애플리케이션 보안 개선에 관심이 있는 누구나 자유롭게 이용하고 공유할 수 있도록 공개하고 있다. 각 지역 챕터의 생성 및 참여도 자유롭게 가능하다. -We advocate approaching application security as a people, process, and technology problem, because the most effective approaches to application security require improvements in all these areas. +OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역에서 개선이 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. -OWASP is a different kind of organization. Our freedom from commercial pressures allows us to provide unbiased, practical, and cost-effective information about application security. +OWASP는 조금 다른 성격의 조직이다. 상업적 이해관계에서 벗어나 있기 때문에, 애플리케이션 보안에 관해 편향되지 않고 실질적이며 비용적으로 효율적인 정보를 제공하고 있다. -OWASP is not affiliated with any technology company, although we support the informed use of commercial security technology. OWASP produces many types of materials in a collaborative, transparent, and open way. +OWASP는 특정 기술 기업과 제휴하지 않지만, 상용 보안 기술의 올바른 활용을 지지한다. OWASP는 여러 자료를, 협력을 통해 투명하며 개방적인 방식으로 제작한다. -The OWASP Foundation is the non-profit entity that ensures the project's long-term success. Almost everyone associated with OWASP is a volunteer, including the OWASP board, chapter leaders, project leaders, and project members. We support innovative security research with grants and infrastructure. +OWASP 재단은 프로젝트의 지속적인 발전을 뒷받침하는 비영리 단체입니다. OWASP에는 이사회부터 지부 리더, 프로젝트 구성원까지 대부분이 자원봉사자로 참여하고 있으며, 기존의 틀을 깨는 보안 연구를 후원하고 필요한 인프라를 제공한다. -Join us! +저희와 함께해주세요! -## Copyright and License +## 저작권 및 라이선스 ![License](../assets/license.png) -Copyright © 2003-2025 The OWASP® Foundation, Inc. This document is released under the Creative Commons Attribution Share-Alike 4.0 license. For any reuse or distribution, you must make it clear to others the license terms of this work. +Copyright © 2003-2025 The OWASP® Foundation, Inc. 이 문서는 Creative Commons Attribution-ShareAlike 4.0 라이선스에 따라 배포된다. 이 자료를 재사용하거나 배포할 경우, 반드시 해당 저작물의 라이선스 조건을 명확히 밝혀야 한다. From 4f37c15b3345f120a668b5a8213fa0f99c3a9fbe Mon Sep 17 00:00:00 2001 From: ni5am Date: Fri, 26 Dec 2025 17:41:10 +0900 Subject: [PATCH 008/167] Update some words for clarity and terminology --- 2025/docs/ko/0x01_2025-About_OWASP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index d5b4855be..7d6ac970f 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -7,7 +7,7 @@ OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있 - 애플리케이션 보안 도구 및 표준 - 선도적인 연구 - 표준 보안통제 항목 및 라이브러리 -- 애플리케이션 보안 테스팅, 보안 코드 개발, 보안 코드 리뷰에 관한 서적적 +- 애플리케이션 보안 테스팅, 시큐어 코딩, 코드 보안 리뷰에 관한 서적 - 프레젠테이션 및 [동영상](https://www.youtube.com/user/OWASPGLOBAL) - 다양한 주제의 보안 [치트 시트](https://cheatsheetseries.owasp.org/) - 전 세계 및 온라인에서 개최되는 [챕터 모임](https://owasp.org/chapters/) From 0765ed1180a2fb914a5faca4f1a3d57b85ee91e3 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Fri, 26 Dec 2025 18:32:24 +0900 Subject: [PATCH 009/167] localize OWASP Top 10 2025 content to Korean --- 2025/docs/kr/0x00_2025-Introduction.md | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index 45d54f290..31993340f 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -30,58 +30,58 @@ OWASP Top 10의 8번째 버전을 환영합니다! 2025년 Top 10에는 두 개의 신규 카테고리와 하나의 통합이 포함되어 있다. 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 공학과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 카테고리를 구성하는 것은 사실상 불가능하다. ![Mapping](../assets/2025-mappings.png) +# OWASP Top 10 2025 -* **[A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지한다. 제공된 데이터에 따르면 평균적으로 테스트된 애플리케이션의 3.73%가 이 카테고리의 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 포함한다. 위 그림의 점선으로 표시된 바와 같이, SSRF(Server-Side Request Forgery)가 이 카테고리에 통합되었다. -* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년의 5위에서 2025년에는 2위로 상승했다. 이번 주기의 데이터에서 설정 오류가 더 많이 나타났다. 테스트된 애플리케이션의 3.00%가 이 카테고리의 16개 CWE 중 하나 이상을 포함한다. 소프트웨어 공학에서 구성 기반 애플리케이션 동작이 지속적으로 증가하고 있어 이는 예상된 결과이다. -* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라의 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 광범위한 침해를 포함한다. 이 카테고리는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 선정되었다. 이 카테고리는 5개의 CWE를 포함하며 수집된 데이터에서 제한적으로 나타났는데, 이는 테스트의 어려움에 기인한 것으로 판단되며 향후 이 분야의 테스트 방법론이 발전하기를 기대한다. 이 카테고리는 데이터상 가장 낮은 발생 빈도를 보이지만, CVE(Common Vulnerabilities and Exposures)의 평균 악용 및 영향 점수는 가장 높다. -* **[A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했다. 제공된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 카테고리의 32개 CWE 중 하나 이상을 포함한다. 이 카테고리는 종종 민감한 데이터 노출이나 시스템 침해로 이어진다. -* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지한다. 인젝션은 가장 많이 테스트되는 카테고리 중 하나이며, 이 카테고리의 38개 CWE와 연관된 CVE의 수가 가장 많다. 인젝션에는 Cross-Site Scripting(XSS, 높은 빈도/낮은 영향)에서 SQL Injection(낮은 빈도/높은 영향) 취약점에 이르기까지 다양한 문제가 포함된다. -* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 순위가 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 위협 모델링과 관련하여 업계에서 눈에 띄는 개선이 있었고 보안 설계에 대한 강조도 증가했다. -* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 이 카테고리의 36개 CWE를 더 정확하게 반영하기 위해 약간의 명칭 변경(이전 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지한다. 이 카테고리는 여전히 중요하지만, 인증을 위한 표준화된 프레임워크의 사용 증가가 인증 실패 발생에 긍정적 영향을 미치고 있다. -* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 유지한다. 이 카테고리는 신뢰 경계를 유지하고 소프트웨어 공급망 실패보다 낮은 수준에서 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 데 실패하는 경우에 초점을 둔다. -* **[A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지한다. 이 카테고리는 관련 로깅 이벤트에 대한 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 명칭 변경(이전 "[보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었다. 경고 기능이 없는 우수한 로깅만으로는 보안 사고를 식별하는 데 최소한의 가치만 제공한다. 이 카테고리는 데이터상 항상 과소평가되어 왔으며, 커뮤니티 설문 조사 참가자들의 투표를 통해 다시 목록에 포함되었다. -* **[A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년의 신규 카테고리이다. 이 카테고리는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 개방(fail-open) 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함한다. +* **[A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위 자리를 유지한다. 수집된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 속하는 40개 CWE 중 하나 이상을 포함하고 있다. 위 그림의 점선에서 볼 수 있듯이, SSRF(Server-Side Request Forgery)가 이 카테고리에 통합되었다. +* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년 5위에서 2025년 2위로 상승했다. 이번 주기 데이터에서 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션의 3.00%가 이 카테고리의 16개 CWE 중 하나 이상을 포함한다. 소프트웨어 엔지니어링에서 설정 기반 애플리케이션 동작이 지속적으로 증가하고 있어 이는 놀라운 결과가 아니다. +* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라 등 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 광범위한 침해를 포함한다. 이 카테고리는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 선정되었다. 5개의 CWE를 포함하며 수집된 데이터에서는 제한적으로 나타나지만, 이는 테스트의 어려움 때문으로 보이며 향후 이 분야의 테스트가 발전하기를 기대한다. 데이터상 발생 빈도는 가장 낮지만, CVE의 평균 악용 및 영향 점수는 가장 높다. +* **[A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했다. 수집된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 카테고리의 32개 CWE 중 하나 이상을 포함한다. 이 카테고리는 종종 민감한 데이터 노출이나 시스템 침해로 이어진다. +* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지한다. 인젝션은 가장 많이 테스트되는 카테고리 중 하나로, 38개 CWE와 연관된 CVE 수가 가장 많다. 인젝션에는 XSS(Cross-site Scripting, 높은 빈도/낮은 영향)부터 SQL 인젝션(낮은 빈도/높은 영향) 취약점까지 다양한 문제가 포함된다. +* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 4위에서 6위로 두 단계 하락했다. 2021년에 도입된 이 카테고리는 위협 모델링 관련 업계의 눈에 띄는 개선과 보안 설계에 대한 강조 증가를 보여주고 있다. +* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 이 카테고리의 36개 CWE를 더 정확하게 반영하기 위해 약간의 명칭 변경(이전 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지한다. 이 카테고리는 여전히 중요하지만, 표준화된 인증 프레임워크의 사용 증가가 인증 실패 발생에 긍정적인 영향을 미치고 있는 것으로 보인다. +* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 유지한다. 이 카테고리는 소프트웨어 공급망 실패보다 낮은 수준에서 신뢰 경계를 유지하고 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 데 실패하는 경우에 초점을 맞춘다. +* **[A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지한다. 이 카테고리는 관련 로깅 이벤트에 대해 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 명칭 변경(이전 "[보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었다. 경고 없는 훌륭한 로깅은 보안 사고를 식별하는 데 최소한의 가치만 제공한다. 이 카테고리는 데이터상 항상 과소평가되어 왔으며, 커뮤니티 설문 조사 참가자들의 투표로 다시 목록에 포함되었다. +* **[A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년 신규 카테고리다. 이 카테고리는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 허용(fail-open) 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함한다. ## 방법론 -이번 Top 10 버전은 데이터에 기반하되, 맹목적으로 데이터에만 의존하지 않았다. 제공된 데이터를 기반으로 12개 카테고리의 순위를 매기고, 커뮤니티 설문 조사 응답에 따라 2개를 승격하거나 강조했다. 이러한 접근 방식을 채택한 근본적인 이유는 다음과 같다. 제공된 데이터를 검토하는 것은 본질적으로 과거를 되돌아보는 것이다. 애플리케이션 보안 연구자들은 새로운 취약점을 식별하고 새로운 테스트 방법을 개발하는 데 시간을 투자한다. 이러한 테스트를 도구와 프로세스에 통합하는 데는 몇 주에서 몇 년이 소요된다. 대규모로 약점을 안정적으로 테스트할 수 있을 때까지 수년이 걸릴 수 있다. 또한 안정적으로 테스트할 수 없어 데이터에 나타나지 않을 수 있는 중요한 위험도 존재한다. 이러한 관점의 균형을 맞추기 위해, 커뮤니티 설문 조사를 통해 현장의 애플리케이션 보안 및 개발 실무자들에게 테스트 데이터에서 과소평가될 수 있는 필수 위험으로 무엇을 파악하고 있는지 조사했다. - +이번 Top Ten은 데이터에 기반하되, 데이터에 맹목적으로 의존하지 않는다. 수집된 데이터를 바탕으로 12개 카테고리의 순위를 매겼고, 커뮤니티 설문 조사 결과에 따라 2개 카테고리를 추가로 선정하거나 강조했다. 이렇게 하는 데는 근본적인 이유가 있다. 수집된 데이터를 분석하는 것은 본질적으로 과거를 들여다보는 일이기 때문이다. 애플리케이션 보안 연구자들은 새로운 취약점을 발견하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자한다. 이러한 테스트를 도구와 프로세스에 통합하려면 몇 주에서 몇 년이 걸린다. 특정 취약점을 대규모로 안정적으로 테스트할 수 있게 될 때쯤이면 이미 수년이 지나 있을 수 있다. 또한 안정적으로 테스트할 수 없어 데이터에 나타나지 않는 중요한 위험들도 존재한다. 이러한 한계를 보완하기 위해 커뮤니티 설문 조사를 활용한다. 현장에서 활동하는 애플리케이션 보안 및 개발 실무자들에게 테스트 데이터에서 과소평가되었을 수 있는 필수적인 위험이 무엇인지 직접 물어보는 것이다. ## 카테고리의 구조화 방법 -몇 가지 카테고리가 이전 OWASP Top 10에서 변경되었다. 다음은 카테고리 변경 사항의 개괄적인 요약이다. +OWASP Top Ten의 이전 버전과 비교해 몇 가지 카테고리가 변경되었다. 다음은 카테고리 변경 사항에 대한 개괄적인 요약이다. -이번 반복에서는 2021년 판에서와 마찬가지로 CWE에 대한 제한 없이 데이터를 요청했다. 특정 연도(2021년부터 시작)에 테스트된 애플리케이션의 수와 테스트에서 발견된 CWE의 인스턴스가 하나 이상 있는 애플리케이션의 수를 요청했다. 이 형식을 통해 애플리케이션 모집단 내에서 각 CWE가 얼마나 널리 분포되어 있는지 추적할 수 있다. 본 분석의 목적상 빈도는 고려하지 않았다. 다른 상황에서는 필요할 수 있지만, 애플리케이션 모집단에서의 실제 확산 정도를 가릴 뿐이기 때문이다. 애플리케이션에 CWE의 인스턴스가 4개 있든 4,000개 있든 Top 10 계산에는 영향을 미치지 않는다. 특히 수동 테스터는 애플리케이션에서 반복되는 횟수에 관계없이 취약점을 한 번만 나열하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 취약점의 모든 인스턴스를 개별적으로 나열한다. 2017년 약 30개의 CWE에서 2021년 거의 400개의 CWE로, 이번 판에서는 데이터 세트에서 분석할 589개의 CWE로 증가했다. 향후 보완 자료로 추가 데이터 분석을 수행할 계획이다. CWE 수의 이러한 상당한 증가는 카테고리 구조화 방법의 변경을 필요로 한다. +이번에는 2021년 버전과 달리 CWE에 대한 제한 없이 데이터를 요청했다. 특정 연도(2021년부터 시작)에 테스트된 애플리케이션 수와 테스트 중 하나 이상의 CWE가 발견된 애플리케이션 수를 요청했다. 이 형식을 통해 애플리케이션 모집단 내에서 각 CWE가 얼마나 널리 퍼져 있는지 추적할 수 있다. 우리는 빈도를 무시하는데, 다른 상황에서는 필요할 수 있지만 애플리케이션 모집단의 실제 유병률을 숨기기 때문이다. 애플리케이션에 CWE 인스턴스가 4개든 4,000개든 Top Ten 계산에는 포함되지 않는다. 특히 수동 테스터는 애플리케이션에서 취약점이 여러 번 반복되더라도 한 번만 기록하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 취약점의 모든 인스턴스를 고유하게 나열한다. 분석 대상 CWE는 2017년 약 30개에서 2021년 약 400개로, 이번 버전에서는 589개로 증가했다. 향후 보충 자료로 추가 데이터 분석을 수행할 계획이다. CWE 수의 이러한 대폭 증가로 인해 카테고리 구조 방식의 변경이 필요해졌다. -수개월 동안 CWE를 그룹화하고 카테고리화하는 데 시간을 투자했으며 추가로 몇 달을 더 소요할 수도 있었다. 그러나 어느 시점에서 종료해야 했다. CWE에는 근본 원인 유형과 증상 유형이 모두 존재하며, 근본 원인 유형은 "암호화 실패" 및 "설정 오류"와 같고 증상 유형은 "민감한 데이터 노출" 및 "서비스 거부"와 같다. 식별 및 해결 지침을 제공하는 데 더 논리적이기 때문에 가능한 한 근본 원인에 초점을 맞추기로 결정했다. 증상보다 근본 원인에 초점을 맞추는 것은 새로운 개념이 아니다. Top 10은 증상과 근본 원인이 혼합되어 있었다. CWE 역시 증상과 근본 원인이 혼합되어 있다. 본 연구에서는 이를 더 의도적으로 명시하고 있을 뿐이다. 이번 판에서는 카테고리당 평균 25개의 CWE가 포함되어 있으며, 하한선은 A03:2025-소프트웨어 공급망 실패의 5개 CWE이고 상한선은 A01:2025-취약한 접근 통제의 40개 CWE이다. 카테고리의 CWE 수를 40개로 제한하기로 결정했다. 이 업데이트된 카테고리 구조는 기업이 언어/프레임워크에 적합한 CWE에 집중할 수 있어 추가적인 교육적 이점을 제공한다. +CWE를 그룹화하고 분류하는 데 수개월을 보냈으며, 추가로 몇 달을 더 계속할 수도 있었다. 어느 시점에서 멈춰야 했다. CWE에는 근본 원인 유형과 증상 유형이 있는데, 근본 원인 유형은 "암호화 실패"나 "설정 오류" 같은 것이고, 증상 유형은 "민감한 데이터 노출"이나 "서비스 거부" 같은 것이다. 우리는 가능한 한 근본 원인에 초점을 맞추기로 했는데, 이것이 식별 및 해결 가이드를 제공하는 데 더 논리적이기 때문이다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, Top Ten은 증상과 근본 원인의 혼합이었다. CWE 역시 증상과 근본 원인의 혼합이며, 우리는 단지 이를 더 명확하게 구분하고 있을 뿐이다. 이번 버전에서 카테고리당 평균 25개의 CWE가 있으며, A03:2025-소프트웨어 공급망 실패와 A09:2025-보안 로깅 및 경고 실패의 최소 5개 CWE부터 A01:2025-취약한 접근 통제의 최대 40개 CWE까지 분포한다. 우리는 카테고리당 CWE 수를 40개로 제한하기로 결정했다. 이 업데이트된 카테고리 구조는 기업들이 특정 언어/프레임워크에 적합한 CWE에 집중할 수 있어 추가적인 교육 효과를 제공한다. -MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 Top 10을 10개의 CWE 목록으로 전환하지 않는 이유에 대한 질문을 받았다. 카테고리에서 여러 CWE를 사용하는 주요 이유는 두 가지이다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이는 Top 10의 일부가 적용되지 않을 수 있어 도구 및 교육/인식 프로그램에 문제를 야기할 수 있다. 두 번째 이유는 일반적인 취약점에 대해 여러 CWE가 존재한다는 것이다. 예를 들어, 일반 인젝션, 명령 인젝션, 크로스 사이트 스크립팅, 하드코딩된 암호, 유효성 검증 부족, 버퍼 오버플로, 민감한 정보의 평문 저장 등에 대해 다양한 CWE가 존재한다. 조직이나 테스터에 따라 다른 CWE가 사용될 수 있다. 여러 CWE가 있는 카테고리를 사용함으로써 공통 카테고리 이름 아래에서 발생할 수 있는 다양한 유형의 약점에 대한 기준과 인식을 높이는 데 도움이 된다. 이번 Top 10 2025 판에서는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 이 릴리스 시점에서 [MITRE에서 다운로드할 수 있는 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 있다. +왜 MITRE Top 25 가장 위험한 소프트웨어 약점처럼 10개의 CWE 목록으로 전환하지 않느냐는 질문을 받아왔다. 우리가 카테고리에 여러 CWE를 사용하는 데는 두 가지 주요 이유가 있다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이로 인해 Top Ten의 일부가 적용되지 않을 수 있어 도구 및 교육/인식 프로그램에 문제가 발생한다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반 인젝션, 커맨드 인젝션, 크로스사이트 스크립팅, 하드코딩된 비밀번호, 검증 부재, 버퍼 오버플로우, 민감한 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 다른 CWE가 사용될 수 있다. 여러 CWE가 포함된 카테고리를 사용함으로써 공통 카테고리명 아래에서 발생할 수 있는 다양한 유형의 약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top Ten 2025 버전에서는 10개 카테고리 내에 248개의 CWE가 있다. 이 문서 발표 시점에 [MITRE에서 다운로드 가능한 데이터베이스](https://cwe.mitre.org)에는 총 968개의 CWE가 있다. ## 카테고리 선택을 위한 데이터 사용 방법 -2021년 판에서와 유사하게, *악용 가능성*과 *(기술적) 영향*을 위해 CVE 데이터를 활용했다. OWASP Dependency Check를 다운로드하고 CVSS(Common Vulnerability Scoring System) 악용 및 영향 점수를 추출하여 CVE와 함께 나열된 관련 CWE별로 그룹화했다. 모든 CVE에는 CVSSv2 점수가 있지만 CVSSv2에는 CVSSv3에서 해결해야 할 결함이 있기 때문에 상당한 연구와 노력이 필요했다. 특정 시점 이후에는 모든 CVE에 CVSSv3 점수도 할당된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 공식이 업데이트되었다. +2021년 버전에서 했던 것과 마찬가지로, *악용 가능성*과 *(기술적) 영향*에 대해 CVE 데이터를 활용했다. OWASP Dependency Check를 다운로드하여 CVSS 악용 및 영향 점수를 추출하고, CVE에 나열된 관련 CWE별로 그룹화했다. 모든 CVE에 CVSSv2 점수가 있지만 CVSSv2에는 CVSSv3에서 해결해야 할 결함이 있어 상당한 연구와 노력이 필요했다. 특정 시점 이후부터는 모든 CVE에 CVSSv3 점수도 할당된다. 또한 CVSSv2와 CVSSv3 사이에서 점수 범위와 공식이 업데이트되었다. -CVSSv2에서는 악용 가능성과 (기술적) 영향이 모두 최대 10.0까지 가능했지만, 공식상 악용 가능성은 60%, 영향은 40%로 감소했다. CVSSv3에서는 이론적 최댓값이 악용 가능성은 6.0, 영향은 4.0으로 제한되었다. 가중치를 고려할 때, 영향 점수는 CVSSv3에서 평균 약 1.5점 상승했고 악용 가능성은 평균 약 0.5점 하락했다. +CVSSv2에서는 악용과 (기술적) 영향 모두 최대 10.0까지 가능했지만, 공식에 의해 악용은 60%, 영향은 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 악용 6.0, 영향 4.0으로 제한되었다. 가중치를 고려하면, 영향 점수는 CVSSv3에서 평균 거의 1.5포인트 높아졌고, 악용 가능성은 평균 거의 0.5포인트 낮아졌다. -NVD(National Vulnerability Database)에서 CWE에 매핑된 약 175,000개의 CVE 레코드(2021년의 125,000개에서 증가)가 OWASP Dependency Check에서 추출되었다. 또한 CVE에 매핑된 643개의 고유한 CWE가 있다(2021년의 241개에서 증가). 추출된 약 220,000개의 CVE 중에서 160,000개는 CVSS v2 점수를, 156,000개는 CVSS v3 점수를, 6,000개는 CVSS v4 점수를 보유하고 있었다. 많은 CVE가 여러 점수를 보유하고 있기 때문에 합계가 220,000개를 초과한다. +OWASP Dependency Check에서 추출한 National Vulnerability Database(NVD)에는 CWE에 매핑된 약 175,000건의 CVE 기록이 있다(2021년 125,000건에서 증가). 또한 CVE에 매핑된 고유 CWE는 643개다(2021년 241개에서 증가). 추출된 약 220,000개의 CVE 중 160,000개는 CVSS v2 점수를, 156,000개는 CVSS v3 점수를, 6,000개는 CVSS v4 점수를 가지고 있다. 많은 CVE가 여러 점수를 가지고 있어 합계가 220,000개를 초과한다. -Top 10 2025의 경우, 다음과 같은 방식으로 평균 악용 및 영향 점수를 계산했다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3를 가진 모집단의 비율과 CVSSv2 점수를 가진 나머지 모집단으로 악용 및 영향 점수를 가중하여 전체 평균을 산출했다. 이러한 평균을 데이터 세트의 CWE에 매핑하여 위험 방정식의 나머지 절반에 대한 악용 및 (기술적) 영향 점수로 사용했다. +Top Ten 2025에서는 평균 악용 및 영향 점수를 다음과 같은 방식으로 계산했다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 가진 모집단의 비율과 CVSSv2 점수를 가진 나머지 모집단으로 악용 및 영향 점수에 가중치를 부여하여 전체 평균을 산출했다. 이 평균을 데이터셋의 CWE에 매핑하여 위험 방정식의 나머지 절반인 악용 및 (기술적) 영향 점수로 사용했다. -CVSS v4.0을 사용하지 않는 이유가 궁금할 수 있다. 이는 점수 알고리즘이 근본적으로 변경되었고, CVSS v2 및 CVSSv3처럼 *악용* 또는 *영향* 점수를 더 이상 쉽게 제공하지 않기 때문이다. 향후 버전의 Top 10에서는 CVSS v4.0 점수를 활용하는 방법을 모색할 예정이나, 2025년 판에서는 적시에 이를 반영하지 못했다. +왜 CVSS v4.0을 사용하지 않느냐고 물을 수 있다. 그 이유는 점수 산정 알고리즘이 근본적으로 변경되어 CVSS v2 및 CVSSv3처럼 *악용* 또는 *영향* 점수를 쉽게 제공하지 않기 때문이다. 향후 Top Ten 버전에서 CVSS v4.0 점수를 사용할 방법을 찾을 예정이지만, 2025년 버전에서는 적시에 방법을 결정할 수 없었다. ## 커뮤니티 설문 조사를 사용하는 이유 -데이터의 결과는 대부분 업계에서 자동화된 방식으로 테스트할 수 있는 것으로 제한된다. 숙련된 애플리케이션 보안 전문가와 대화하면, 그들이 발견한 사실과 아직 데이터에 반영되지 않은 추세에 대해 들을 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되고, 그 테스트가 자동화되어 대규모 애플리케이션 모집단에 대해 실행되는 데 더 많은 시간이 걸린다. 우리가 발견하는 모든 것은 과거를 되돌아보는 것이며, 데이터에 나타나지 않는 작년의 추세를 놓칠 수 있다. +데이터 결과는 대체로 업계가 자동화된 방식으로 테스트할 수 있는 것에 한정되어 있다. 경험 많은 AppSec 전문가와 이야기해 보면, 아직 데이터에 반영되지 않은 그들이 발견하는 것들과 관찰하는 트렌드에 대해 들을 수 있을 것이다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 걸리고, 그 테스트를 자동화하여 대규모 애플리케이션 모집단에 적용하는 데 또 시간이 걸린다. 우리가 발견하는 모든 것은 과거를 돌아보는 것이며, 데이터에 나타나지 않는 지난 1년간의 트렌드를 놓치고 있을 수 있다. -따라서 데이터에서 10개 카테고리 중 8개만 선택한다. 데이터가 불완전하기 때문이다. 나머지 두 카테고리는 Top 10 커뮤니티 설문 조사에서 도출된다. 이를 통해 현장 실무자들이 데이터에 없고 (데이터로 표현되지 않을 수도 있는) 가장 높은 위험으로 인식하는 것에 투표할 수 있다. +따라서 데이터가 불완전하기 때문에 10개 카테고리 중 8개만 데이터에서 선정한다. 나머지 2개 카테고리는 Top 10 커뮤니티 설문 조사에서 나온다. 이를 통해 현장의 실무자들이 데이터에 없을 수 있고(그리고 영원히 데이터에 나타나지 않을 수도 있는) 가장 높은 위험으로 보는 것에 투표할 수 있다. ## 데이터 제공자에게 감사를 전한다 -다음 조직들이 (여러 익명 기여자와 함께) 280만 개 이상의 애플리케이션에 대한 데이터를 제공하여 이것이 가장 크고 포괄적인 애플리케이션 보안 데이터 세트가 되도록 기여했다. 이들의 협력과 지원이 없었다면 이 프로젝트는 불가능했을 것이다. +다음 조직들(그리고 익명의 기부자들)이 280만 개 이상의 애플리케이션 데이터를 기꺼이 제공해 주었으며, 이를 통해 가장 크고 포괄적인 애플리케이션 보안 데이터셋을 구축할 수 있었다. 여러분의 도움 없이는 불가능했을 것이다. * Accenture (Prague) * Anonymous (multiple) From 8fae6f80f002354273d7de96446c6f3c71534b67 Mon Sep 17 00:00:00 2001 From: ni5am Date: Fri, 26 Dec 2025 22:53:39 +0900 Subject: [PATCH 010/167] typo --- 2025/docs/ko/0x01_2025-About_OWASP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index 7d6ac970f..d46dd05c0 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -24,7 +24,7 @@ OWASP는 조금 다른 성격의 조직이다. 상업적 이해관계에서 벗 OWASP는 특정 기술 기업과 제휴하지 않지만, 상용 보안 기술의 올바른 활용을 지지한다. OWASP는 여러 자료를, 협력을 통해 투명하며 개방적인 방식으로 제작한다. -OWASP 재단은 프로젝트의 지속적인 발전을 뒷받침하는 비영리 단체입니다. OWASP에는 이사회부터 지부 리더, 프로젝트 구성원까지 대부분이 자원봉사자로 참여하고 있으며, 기존의 틀을 깨는 보안 연구를 후원하고 필요한 인프라를 제공한다. +OWASP 재단은 프로젝트의 지속적인 발전을 뒷받침하는 비영리 단체다. OWASP에는 이사회부터 지부 리더, 프로젝트 구성원까지 대부분이 자원봉사자로 참여하고 있으며, 기존의 틀을 깨는 보안 연구를 후원하고 필요한 인프라를 제공한다. 저희와 함께해주세요! From ae39b29604a62d5bd41b8bf851f2635d6d9b9349 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Sat, 27 Dec 2025 16:06:27 +0900 Subject: [PATCH 011/167] Review incorporated (slightly more natural Korean context) --- 2025/docs/kr/0x00_2025-Introduction.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index 31993340f..6da141ea6 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -4,9 +4,9 @@ # 소개 -OWASP Top 10의 8번째 버전을 환영합니다! +OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! -설문 조사에서 데이터와 관점을 제공해 준 모든 분께 깊은 감사를 드립니다. 여러분 없이는 이번 버전이 나올 수 없었습니다. **감사합니다!** +설문 조사를 통해 데이터와 관점을 제공해 준 모든 분께 깊은 감사를 드립니다. 여러분 없이는 이번 버전이 나올 수 없었습니다. **감사합니다!** ## OWASP Top 10:2025 소개 @@ -27,21 +27,21 @@ OWASP Top 10의 8번째 버전을 환영합니다! ## 2025년 Top 10의 변화 -2025년 Top 10에는 두 개의 신규 카테고리와 하나의 통합이 포함되어 있다. 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 공학과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 카테고리를 구성하는 것은 사실상 불가능하다. +2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 카테고리를 구성하는 것은 사실상 불가능하다. ![Mapping](../assets/2025-mappings.png) # OWASP Top 10 2025 -* **[A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위 자리를 유지한다. 수집된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 속하는 40개 CWE 중 하나 이상을 포함하고 있다. 위 그림의 점선에서 볼 수 있듯이, SSRF(Server-Side Request Forgery)가 이 카테고리에 통합되었다. -* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년 5위에서 2025년 2위로 상승했다. 이번 주기 데이터에서 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션의 3.00%가 이 카테고리의 16개 CWE 중 하나 이상을 포함한다. 소프트웨어 엔지니어링에서 설정 기반 애플리케이션 동작이 지속적으로 증가하고 있어 이는 놀라운 결과가 아니다. -* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라 등 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 광범위한 침해를 포함한다. 이 카테고리는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 선정되었다. 5개의 CWE를 포함하며 수집된 데이터에서는 제한적으로 나타나지만, 이는 테스트의 어려움 때문으로 보이며 향후 이 분야의 테스트가 발전하기를 기대한다. 데이터상 발생 빈도는 가장 낮지만, CVE의 평균 악용 및 영향 점수는 가장 높다. -* **[A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했다. 수집된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 카테고리의 32개 CWE 중 하나 이상을 포함한다. 이 카테고리는 종종 민감한 데이터 노출이나 시스템 침해로 이어진다. -* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지한다. 인젝션은 가장 많이 테스트되는 카테고리 중 하나로, 38개 CWE와 연관된 CVE 수가 가장 많다. 인젝션에는 XSS(Cross-site Scripting, 높은 빈도/낮은 영향)부터 SQL 인젝션(낮은 빈도/높은 영향) 취약점까지 다양한 문제가 포함된다. -* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 4위에서 6위로 두 단계 하락했다. 2021년에 도입된 이 카테고리는 위협 모델링 관련 업계의 눈에 띄는 개선과 보안 설계에 대한 강조 증가를 보여주고 있다. -* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 이 카테고리의 36개 CWE를 더 정확하게 반영하기 위해 약간의 명칭 변경(이전 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지한다. 이 카테고리는 여전히 중요하지만, 표준화된 인증 프레임워크의 사용 증가가 인증 실패 발생에 긍정적인 영향을 미치고 있는 것으로 보인다. -* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 유지한다. 이 카테고리는 소프트웨어 공급망 실패보다 낮은 수준에서 신뢰 경계를 유지하고 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 데 실패하는 경우에 초점을 맞춘다. -* **[A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지한다. 이 카테고리는 관련 로깅 이벤트에 대해 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 명칭 변경(이전 "[보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었다. 경고 없는 훌륭한 로깅은 보안 사고를 식별하는 데 최소한의 가치만 제공한다. 이 카테고리는 데이터상 항상 과소평가되어 왔으며, 커뮤니티 설문 조사 참가자들의 투표로 다시 목록에 포함되었다. -* **[A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년 신규 카테고리다. 이 카테고리는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 허용(fail-open) 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함한다. +* **[A01:2025 - Broken_Access_Control](A01_2025-Broken_Access_Control.md)**는 가장 위험한 애플리케이션 보안 위험 1위 자리를 고수했다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 포함되는 40가지 CWE(Common Weakness Enumeration) 중 하나 이상을 포함하고 있었다. 위 도표의 점선이 보여주듯, SSRF(Server-Side Request Forgery)가 이 카테고리에 통합되었다. +* **[A02:2025 - Security_Misconfiguration](A02_2025-Security_Misconfiguration.md)**는 2021년 5위에서 2025년 2위로 상승했다. 이번 주기에 제공된 데이터에서 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션의 3.00%가 이 카테고리의 16개 CWE 중 하나 이상을 포함하고 있다. 소프트웨어 엔지니어링에서 설정 기반 애플리케이션 동작이 지속적으로 증가하고 있어 이는 놀라운 결과가 아니다. +* **[A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라 등 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 광범위한 침해를 포함한다. 이 카테고리는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 선정되었다. 5개의 CWE를 포함하며 수집된 데이터에서는 제한적으로 나타나지만, 이는 테스트의 어려움 때문으로 보이며 향후 이 분야의 테스트가 발전하기를 기대한다. 데이터상 발생 빈도는 가장 낮지만, CVE의 평균 악용 및 영향 점수는 가장 높다. +* **[A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했다. 수집된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 카테고리의 32개 CWE 중 하나 이상을 포함한다. 이 카테고리는 종종 민감한 데이터 노출이나 시스템 침해로 이어진다. +* **[A05:2025 - Injection](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지한다. 인젝션은 가장 많이 테스트되는 카테고리 중 하나로, 38개 CWE와 연관된 CVE 수가 가장 많다. 인젝션에는 XSS(Cross-site Scripting, 높은 빈도/낮은 영향)부터 SQL 인젝션(낮은 빈도/높은 영향) 취약점까지 다양한 문제가 포함된다. +* **[A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 4위에서 6위로 두 단계 하락했다. 2021년에 도입된 이 카테고리는 위협 모델링 관련 업계의 눈에 띄는 개선과 보안 설계에 대한 강조 증가를 보여주고 있다. +* **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 이 카테고리의 36개 CWE를 더 정확하게 반영하기 위해 약간의 명칭 변경(이전 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지한다. 이 카테고리는 여전히 중요하지만, 표준화된 인증 프레임워크의 사용 증가가 인증 실패 발생에 긍정적인 영향을 미치고 있는 것으로 보인다. +* **[A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 유지한다. 이 카테고리는 소프트웨어 공급망 실패보다 낮은 수준에서 신뢰 경계를 유지하고 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 데 실패하는 경우에 초점을 맞춘다. +* **[A09:2025 - Security_Logging_and_Alerting_Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지한다. 이 카테고리는 관련 로깅 이벤트에 대해 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 명칭 변경(이전 "[보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었다. 경고 없는 훌륭한 로깅은 보안 사고를 식별하는 데 최소한의 가치만 제공한다. 이 카테고리는 데이터상 항상 과소평가되어 왔으며, 커뮤니티 설문 조사 참가자들의 투표로 다시 목록에 포함되었다. +* **[A10:2025 - Mishandling_of_Exceptional_Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년 신규 카테고리다. 이 카테고리는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 허용(fail-open) 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함한다. ## 방법론 From af8650eb43b3a8a147810420a90f58c63045d340 Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Sun, 28 Dec 2025 00:50:21 +0900 Subject: [PATCH 012/167] Correct Korean phrase --- 2025/docs/ko/0x01_2025-About_OWASP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index d46dd05c0..1606c07b9 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -26,7 +26,7 @@ OWASP는 특정 기술 기업과 제휴하지 않지만, 상용 보안 기술의 OWASP 재단은 프로젝트의 지속적인 발전을 뒷받침하는 비영리 단체다. OWASP에는 이사회부터 지부 리더, 프로젝트 구성원까지 대부분이 자원봉사자로 참여하고 있으며, 기존의 틀을 깨는 보안 연구를 후원하고 필요한 인프라를 제공한다. -저희와 함께해주세요! +저희와 함께해요! ## 저작권 및 라이선스 From 3a9f2b5bed2d11fb83286ad7400f142644159a0f Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Sun, 28 Dec 2025 06:31:42 +0900 Subject: [PATCH 013/167] Manually reviewed all sentences for natural flow --- 2025/docs/kr/0x00_2025-Introduction.md | 68 +++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index 6da141ea6..dcc8711fc 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -13,16 +13,16 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! -* [A01:2025 - 취약한 접근 통제](A01_2025-Broken_Access_Control.md) -* [A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md) -* [A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md) -* [A04:2025 - 암호화 실패](A04_2025-Cryptographic_Failures.md) -* [A05:2025 - 인젝션](A05_2025-Injection.md) -* [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) -* [A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md) -* [A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md) -* [A09:2025 - 보안 로깅 및 경고 실패](A09_2025-Security_Logging_and_Alerting_Failures.md) -* [A10:2025 - 예외 상황 처리 오류](A10_2025-Mishandling_of_Exceptional_Conditions.md) +* [A01:2025 - Broken_Access_Control](A01_2025-Broken_Access_Control.md) +* [A02:2025 - Security_Misconfiguration](A02_2025-Security_Misconfiguration.md) +* [A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md) +* [A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md) +* [A05:2025 - Injection](A05_2025-Injection.md) +* [A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md) +* [A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md) +* [A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md) +* [A09:2025 - Security_Logging_and_Alerting_Failures](A09_2025-Security_Logging_and_Alerting_Failures.md) +* [A10:2025 - Mishandling_of_Exceptional_Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md) ## 2025년 Top 10의 변화 @@ -32,56 +32,56 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ![Mapping](../assets/2025-mappings.png) # OWASP Top 10 2025 -* **[A01:2025 - Broken_Access_Control](A01_2025-Broken_Access_Control.md)**는 가장 위험한 애플리케이션 보안 위험 1위 자리를 고수했다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 포함되는 40가지 CWE(Common Weakness Enumeration) 중 하나 이상을 포함하고 있었다. 위 도표의 점선이 보여주듯, SSRF(Server-Side Request Forgery)가 이 카테고리에 통합되었다. -* **[A02:2025 - Security_Misconfiguration](A02_2025-Security_Misconfiguration.md)**는 2021년 5위에서 2025년 2위로 상승했다. 이번 주기에 제공된 데이터에서 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션의 3.00%가 이 카테고리의 16개 CWE 중 하나 이상을 포함하고 있다. 소프트웨어 엔지니어링에서 설정 기반 애플리케이션 동작이 지속적으로 증가하고 있어 이는 놀라운 결과가 아니다. -* **[A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md)**는 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장하여 소프트웨어 의존성, 빌드 시스템, 배포 인프라 등 전체 생태계 내에서 또는 전반에 걸쳐 발생하는 더 광범위한 침해를 포함한다. 이 카테고리는 커뮤니티 설문 조사에서 압도적으로 최우선 관심사로 선정되었다. 5개의 CWE를 포함하며 수집된 데이터에서는 제한적으로 나타나지만, 이는 테스트의 어려움 때문으로 보이며 향후 이 분야의 테스트가 발전하기를 기대한다. 데이터상 발생 빈도는 가장 낮지만, CVE의 평균 악용 및 영향 점수는 가장 높다. -* **[A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md)**는 순위에서 2위에서 4위로 두 단계 하락했다. 수집된 데이터에 따르면 평균적으로 애플리케이션의 3.80%가 이 카테고리의 32개 CWE 중 하나 이상을 포함한다. 이 카테고리는 종종 민감한 데이터 노출이나 시스템 침해로 이어진다. -* **[A05:2025 - Injection](A05_2025-Injection.md)**은 순위에서 3위에서 5위로 두 단계 하락했으며, 암호화 실패 및 안전하지 않은 설계와의 상대적 위치를 유지한다. 인젝션은 가장 많이 테스트되는 카테고리 중 하나로, 38개 CWE와 연관된 CVE 수가 가장 많다. 인젝션에는 XSS(Cross-site Scripting, 높은 빈도/낮은 영향)부터 SQL 인젝션(낮은 빈도/높은 영향) 취약점까지 다양한 문제가 포함된다. -* **[A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 4위에서 6위로 두 단계 하락했다. 2021년에 도입된 이 카테고리는 위협 모델링 관련 업계의 눈에 띄는 개선과 보안 설계에 대한 강조 증가를 보여주고 있다. -* **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 이 카테고리의 36개 CWE를 더 정확하게 반영하기 위해 약간의 명칭 변경(이전 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")과 함께 7위를 유지한다. 이 카테고리는 여전히 중요하지만, 표준화된 인증 프레임워크의 사용 증가가 인증 실패 발생에 긍정적인 영향을 미치고 있는 것으로 보인다. -* **[A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md)**는 목록에서 8위를 유지한다. 이 카테고리는 소프트웨어 공급망 실패보다 낮은 수준에서 신뢰 경계를 유지하고 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하는 데 실패하는 경우에 초점을 맞춘다. -* **[A09:2025 - Security_Logging_and_Alerting_Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지한다. 이 카테고리는 관련 로깅 이벤트에 대해 적절한 조치를 유도하는 데 필요한 경고 기능의 중요성을 강조하기 위해 약간의 명칭 변경(이전 "[보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)")이 있었다. 경고 없는 훌륭한 로깅은 보안 사고를 식별하는 데 최소한의 가치만 제공한다. 이 카테고리는 데이터상 항상 과소평가되어 왔으며, 커뮤니티 설문 조사 참가자들의 투표로 다시 목록에 포함되었다. -* **[A10:2025 - Mishandling_of_Exceptional_Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년 신규 카테고리다. 이 카테고리는 시스템이 직면할 수 있는 비정상적인 조건에서 비롯된 부적절한 오류 처리, 논리적 오류, 실패 시 허용(fail-open) 및 기타 관련 시나리오에 초점을 맞춘 24개의 CWE를 포함한다. - +**[A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 수집된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 보유하고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. +**[A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 수집된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 보유하고 있었다. 이는 소프트웨어 엔지니어링에서 설정에 기반한 애플리케이션 동작이 지속적으로 증가하고 있는 추세를 고려하면 예상 가능한 결과이다. +* **[A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md)**이 카테고리는 기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장한 것으로, 소프트웨어 종속성뿐 아니라 빌드 시스템과 배포 인프라 전반에 걸친 공급망 위협까지 포괄한다. 커뮤니티 설문에서 가장 우려되는 보안 이슈로 선정되었음에도, 실제 데이터에서는 발생 빈도가 가장 낮게 나타났다. 이는 위협이 적기 때문이 아니라 테스트 자체가 어렵기 때문이다. 현재 5개의 CWE가 매핑되어 있으며, 테스트 방법론이 발전함에 따라 더 많은 사례가 포착될 것으로 예상된다. 주목할 점은 발생 빈도는 낮지만 CVE 기준 익스플로잇 가능성과 영향도 점수가 가장 높다는 것이다. 한 번 발생하면 피해 규모가 크다는 의미이다. +* **[A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 계단 하락하였다. 수집된 데이터에 따르면 평균 3.80%의 애플리케이션에서 관련 CWE 32개 중 하나 이상이 발견되었다. 암호화 관련 취약점은 민감한 데이터 유출이나 시스템 침해로 이어지는 경우가 많아 여전히 주의가 필요한 영역이다. +* **[A05:2025 - Injection](A05_2025-Injection.md)**은 3위에서 5위로 두 계단 하락하였다. 인젝션은 가장 많이 테스트되는 카테고리 중 하나이며, 38개의 CWE가 매핑되어 있고 관련 CVE 수도 가장 많다. 이 카테고리에는 XSS(Cross-site Scripting)발생 빈도 높음/영향도 낮음)부터 SQL 인젝션(발생 빈도 낮음/영향도 높음)까지 다양한 유형의 취약점이 포함된다. +* **[A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md)**은 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 계단 하락하였다. 이 카테고리는 2021년에 신설되었으며, 이후 업계에서 Threat Modeling 도입과 Secure Design에 대한 강조가 눈에 띄게 진전되었다. +* **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 카테고리에 포함된 36개의 CWE를 보다 정확하게 반영하기 위해 명칭이 변경되었다(기존 명칭 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)"). 이 카테고리는 여전히 중요하지만, 인증(Authentication)을 위한 표준화된 프레임워크 도입이 확산되면서 관련 취약점 발생이 감소하는 추세이다. +* **[A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md)**는 8위를 유지하였다. 이 카테고리는 Trust Boundary 유지 실패와 소프트웨어, 코드, 데이터 아티팩트의 무결성 검증 실패에 초점을 맞추고 있으며, Software Supply Chain Failures보다 낮은 수준의 무결성 문제를 다룬다. +* **[A09:2025 - Security Logging & Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 명칭: [Security Logging and Monitoring Failures](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)). 아무리 훌륭한 로깅을 갖추더라도 알람이 없으면 보안 사고 식별에 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에서 과소 대표되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 목록에 포함되었다. +**[A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 신설된 카테고리이다. 이 카테고리에는 부적절한 오류 처리, 논리적 오류, 실패 시 개방(Fail-open) 및 시스템이 직면할 수 있는 비정상적인 조건에서 발생하는 기타 시나리오에 초점을 맞춘 24개의 CWE가 포함되어 있다. ## 방법론 -이번 Top Ten은 데이터에 기반하되, 데이터에 맹목적으로 의존하지 않는다. 수집된 데이터를 바탕으로 12개 카테고리의 순위를 매겼고, 커뮤니티 설문 조사 결과에 따라 2개 카테고리를 추가로 선정하거나 강조했다. 이렇게 하는 데는 근본적인 이유가 있다. 수집된 데이터를 분석하는 것은 본질적으로 과거를 들여다보는 일이기 때문이다. 애플리케이션 보안 연구자들은 새로운 취약점을 발견하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자한다. 이러한 테스트를 도구와 프로세스에 통합하려면 몇 주에서 몇 년이 걸린다. 특정 취약점을 대규모로 안정적으로 테스트할 수 있게 될 때쯤이면 이미 수년이 지나 있을 수 있다. 또한 안정적으로 테스트할 수 없어 데이터에 나타나지 않는 중요한 위험들도 존재한다. 이러한 한계를 보완하기 위해 커뮤니티 설문 조사를 활용한다. 현장에서 활동하는 애플리케이션 보안 및 개발 실무자들에게 테스트 데이터에서 과소평가되었을 수 있는 필수적인 위험이 무엇인지 직접 물어보는 것이다. +이번 Top Ten은 데이터에 기반하되, 데이터에 맹목적으로 의존하지는 않는다. 수집된 데이터를 기반으로 12개 카테고리의 순위를 산정하였으며, 커뮤니티 설문조사 결과를 통해 2개 카테고리를 추가로 선정하거나 강조될 수 있도록 했다. 이러한 접근 방식을 채택한 근본적인 이유는, 수집된 데이터를 분석하는 것은 본질적으로 과거를 돌아보는 작업이기 때문이다.애플리케이션 보안 연구자들은 새로운 취약점을 발굴하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자하고 있다. 이러한 테스트를 도구와 프로세스에 통합하기까지는 몇 주에서 몇 년이 소요된다. 특정 취약점을 대규모로 신뢰성 있게 테스트할 수 있게 될 때쯤이면 이미 몇 년이 경과한 경우가 많다. 또한 신뢰성 있게 테스트하기가 어려워 데이터에 반영되지 않는 중요한 위험 항목도 존재한다.이러한 관점을 보완하기 위해, 우리는 현장에서 활동하는 애플리케이션 보안 및 개발 실무자들에게 커뮤니티 설문을 통해 테스트 데이터에서 충분히 반영되지 못하고 있는 핵심 위험 요소가 무엇이라고 생각하는지 묻는다. ## 카테고리의 구조화 방법 -OWASP Top Ten의 이전 버전과 비교해 몇 가지 카테고리가 변경되었다. 다음은 카테고리 변경 사항에 대한 개괄적인 요약이다. +이전 OWASP Top Ten에서 몇 가지 카테고리가 변경되었다. 다음은 카테고리 변경 사항에 대한 대략적인 요약이다. -이번에는 2021년 버전과 달리 CWE에 대한 제한 없이 데이터를 요청했다. 특정 연도(2021년부터 시작)에 테스트된 애플리케이션 수와 테스트 중 하나 이상의 CWE가 발견된 애플리케이션 수를 요청했다. 이 형식을 통해 애플리케이션 모집단 내에서 각 CWE가 얼마나 널리 퍼져 있는지 추적할 수 있다. 우리는 빈도를 무시하는데, 다른 상황에서는 필요할 수 있지만 애플리케이션 모집단의 실제 유병률을 숨기기 때문이다. 애플리케이션에 CWE 인스턴스가 4개든 4,000개든 Top Ten 계산에는 포함되지 않는다. 특히 수동 테스터는 애플리케이션에서 취약점이 여러 번 반복되더라도 한 번만 기록하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 취약점의 모든 인스턴스를 고유하게 나열한다. 분석 대상 CWE는 2017년 약 30개에서 2021년 약 400개로, 이번 버전에서는 589개로 증가했다. 향후 보충 자료로 추가 데이터 분석을 수행할 계획이다. CWE 수의 이러한 대폭 증가로 인해 카테고리 구조 방식의 변경이 필요해졌다. +이번 조사에서는 2021년 버전과 달리 CWE에 대한 제한 없이 데이터를 수집하였다. 특정 연도(2021년부터)에 테스트된 애플리케이션 수와 테스트에서 CWE가 하나 이상 발견된 애플리케이션 수를 요청하였다. 이 방식을 통해 각 CWE가 전체 애플리케이션 중 얼마나 널리 분포하는지 파악할 수 있다. 발생 빈도는 의도적으로 고려하지 않았는데, 이는 다른 상황에서는 유용할 수 있으나 전체 애플리케이션에서의 실제 발생률을 왜곡할 수 있기 때문이다. 애플리케이션에서 특정 CWE가 4건 발견되었든 4,000건 발견되었든 Top Ten 산정에는 영향을 미치지 않는다. 이는 Manual Tester가 동일한 취약점을 애플리케이션 내에서 여러 번 발견하더라도 한 번만 기록하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 모든 인스턴스를 개별적으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개에서 2021년 약 400개로, 이번 버전에서는 589개로 증가하였다. 향후 추가적인 데이터 분석을 보완 자료로 제공할 계획이다. CWE 수의 대폭 증가로 인해 카테고리 구조의 변경이 불가피하였다. -CWE를 그룹화하고 분류하는 데 수개월을 보냈으며, 추가로 몇 달을 더 계속할 수도 있었다. 어느 시점에서 멈춰야 했다. CWE에는 근본 원인 유형과 증상 유형이 있는데, 근본 원인 유형은 "암호화 실패"나 "설정 오류" 같은 것이고, 증상 유형은 "민감한 데이터 노출"이나 "서비스 거부" 같은 것이다. 우리는 가능한 한 근본 원인에 초점을 맞추기로 했는데, 이것이 식별 및 해결 가이드를 제공하는 데 더 논리적이기 때문이다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, Top Ten은 증상과 근본 원인의 혼합이었다. CWE 역시 증상과 근본 원인의 혼합이며, 우리는 단지 이를 더 명확하게 구분하고 있을 뿐이다. 이번 버전에서 카테고리당 평균 25개의 CWE가 있으며, A03:2025-소프트웨어 공급망 실패와 A09:2025-보안 로깅 및 경고 실패의 최소 5개 CWE부터 A01:2025-취약한 접근 통제의 최대 40개 CWE까지 분포한다. 우리는 카테고리당 CWE 수를 40개로 제한하기로 결정했다. 이 업데이트된 카테고리 구조는 기업들이 특정 언어/프레임워크에 적합한 CWE에 집중할 수 있어 추가적인 교육 효과를 제공한다. +CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. Root Cause 유형에는 "Cryptographic Failure", "Misconfiguration" 등이 있고, Symptom 유형에는 "Sensitive Data Exposure", "Denial of Service" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 Root Cause에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. Symptom보다 Root Cause에 집중하는 것은 새로운 개념이 아니며, 기존 Top Ten도 Symptom과 Root Cause가 혼재되어 있었다. CWE 자체도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-Software Supply Chain Failures, A09:2025-Security Logging and Alerting Failures)에서 최대 40개(A01:2025-Broken Access Control)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. -왜 MITRE Top 25 가장 위험한 소프트웨어 약점처럼 10개의 CWE 목록으로 전환하지 않느냐는 질문을 받아왔다. 우리가 카테고리에 여러 CWE를 사용하는 데는 두 가지 주요 이유가 있다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이로 인해 Top Ten의 일부가 적용되지 않을 수 있어 도구 및 교육/인식 프로그램에 문제가 발생한다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반 인젝션, 커맨드 인젝션, 크로스사이트 스크립팅, 하드코딩된 비밀번호, 검증 부재, 버퍼 오버플로우, 민감한 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 다른 CWE가 사용될 수 있다. 여러 CWE가 포함된 카테고리를 사용함으로써 공통 카테고리명 아래에서 발생할 수 있는 다양한 유형의 약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top Ten 2025 버전에서는 10개 카테고리 내에 248개의 CWE가 있다. 이 문서 발표 시점에 [MITRE에서 다운로드 가능한 데이터베이스](https://cwe.mitre.org)에는 총 968개의 CWE가 있다. +MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이로 인해 Top Ten의 일부가 적용되지 않는 경우 도구 및 교육/인식 프로그램에 문제가 발생한다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 Injection, Command Injection, Cross-site Scripting, Hardcoded Passwords, Lack of Validation, Buffer Overflows, Cleartext Storage of Sensitive Information 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top Ten 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. ## 카테고리 선택을 위한 데이터 사용 방법 -2021년 버전에서 했던 것과 마찬가지로, *악용 가능성*과 *(기술적) 영향*에 대해 CVE 데이터를 활용했다. OWASP Dependency Check를 다운로드하여 CVSS 악용 및 영향 점수를 추출하고, CVE에 나열된 관련 CWE별로 그룹화했다. 모든 CVE에 CVSSv2 점수가 있지만 CVSSv2에는 CVSSv3에서 해결해야 할 결함이 있어 상당한 연구와 노력이 필요했다. 특정 시점 이후부터는 모든 CVE에 CVSSv3 점수도 할당된다. 또한 CVSSv2와 CVSSv3 사이에서 점수 범위와 공식이 업데이트되었다. +2021년 버전과 마찬가지로 *Exploitability* 및 *(Technical) Impact*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. -CVSSv2에서는 악용과 (기술적) 영향 모두 최대 10.0까지 가능했지만, 공식에 의해 악용은 60%, 영향은 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 악용 6.0, 영향 4.0으로 제한되었다. 가중치를 고려하면, 영향 점수는 CVSSv3에서 평균 거의 1.5포인트 높아졌고, 악용 가능성은 평균 거의 0.5포인트 낮아졌다. +CVSSv2에서는 Exploit과 (Technical) Impact 모두 최대 10.0까지 가능하였으나, 공식에 따라 Exploit은 60%, Impact는 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 Exploit 6.0, Impact 4.0으로 제한되었다. 가중치를 고려한 결과, Impact 점수는 CVSSv3에서 평균적으로 약 1.5점 상승하였고, Exploitability는 평균적으로 약 0.5점 하락하였다. -OWASP Dependency Check에서 추출한 National Vulnerability Database(NVD)에는 CWE에 매핑된 약 175,000건의 CVE 기록이 있다(2021년 125,000건에서 증가). 또한 CVE에 매핑된 고유 CWE는 643개다(2021년 241개에서 증가). 추출된 약 220,000개의 CVE 중 160,000개는 CVSS v2 점수를, 156,000개는 CVSS v3 점수를, 6,000개는 CVSS v4 점수를 가지고 있다. 많은 CVE가 여러 점수를 가지고 있어 합계가 220,000개를 초과한다. +OWASP Dependency Check에서 추출한 National Vulnerability Database(NVD) 데이터에는 CWE에 매핑된 CVE 기록이 약 175,000건(2021년 125,000건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년 241개에서 증가)이다. 추출된 약 220,000건의 CVE 중 160,000건은 CVSS v2 점수를, 156,000건은 CVSS v3 점수를, 6,000건은 CVSS v4 점수를 보유하고 있다. 다수의 CVE가 복수의 점수를 보유하고 있어 합계가 220,000건을 초과한다. -Top Ten 2025에서는 평균 악용 및 영향 점수를 다음과 같은 방식으로 계산했다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 가진 모집단의 비율과 CVSSv2 점수를 가진 나머지 모집단으로 악용 및 영향 점수에 가중치를 부여하여 전체 평균을 산출했다. 이 평균을 데이터셋의 CWE에 매핑하여 위험 방정식의 나머지 절반인 악용 및 (기술적) 영향 점수로 사용했다. +Top Ten 2025에서는 다음과 같은 방식으로 평균 Exploit 및 Impact 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 보유한 비율과 CVSSv2 점수를 보유한 나머지 비율에 따라 Exploit 및 Impact 점수에 가중치를 부여하여 전체 평균을 산출하였다. 이 평균값을 데이터셋의 CWE에 매핑하여 위험 산정 공식의 나머지 절반인 Exploit 및 (Technical) Impact 점수로 활용하였다. -왜 CVSS v4.0을 사용하지 않느냐고 물을 수 있다. 그 이유는 점수 산정 알고리즘이 근본적으로 변경되어 CVSS v2 및 CVSSv3처럼 *악용* 또는 *영향* 점수를 쉽게 제공하지 않기 때문이다. 향후 Top Ten 버전에서 CVSS v4.0 점수를 사용할 방법을 찾을 예정이지만, 2025년 버전에서는 적시에 방법을 결정할 수 없었다. +CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 산정 알고리즘이 근본적으로 변경되어 CVSS v2 및 v3처럼 *Exploit* 또는 *Impact* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top Ten 버전에서는 CVSS v4.0 점수 활용 방안을 모색할 계획이나, 2025년 버전에서는 적절한 시점에 적용할 수 있는 방법을 찾지 못하였다. ## 커뮤니티 설문 조사를 사용하는 이유 -데이터 결과는 대체로 업계가 자동화된 방식으로 테스트할 수 있는 것에 한정되어 있다. 경험 많은 AppSec 전문가와 이야기해 보면, 아직 데이터에 반영되지 않은 그들이 발견하는 것들과 관찰하는 트렌드에 대해 들을 수 있을 것이다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 걸리고, 그 테스트를 자동화하여 대규모 애플리케이션 모집단에 적용하는 데 또 시간이 걸린다. 우리가 발견하는 모든 것은 과거를 돌아보는 것이며, 데이터에 나타나지 않는 지난 1년간의 트렌드를 놓치고 있을 수 있다. +데이터 결과는 주로 업계에서 자동화된 방식으로 테스트할 수 있는 범위에 한정된다. AppSec 전문가와 대화해 보면 아직 데이터에 반영되지 않은 발견 사항과 트렌드에 대해 들을 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되며, 이러한 테스트를 자동화하여 대규모 애플리케이션에 적용하는 데는 더 많은 시간이 필요하다. 현재 확인할 수 있는 모든 것은 과거를 돌아보는 것이며, 데이터에 반영되지 않은 최근 트렌드가 누락되어 있을 수 있다. -따라서 데이터가 불완전하기 때문에 10개 카테고리 중 8개만 데이터에서 선정한다. 나머지 2개 카테고리는 Top 10 커뮤니티 설문 조사에서 나온다. 이를 통해 현장의 실무자들이 데이터에 없을 수 있고(그리고 영원히 데이터에 나타나지 않을 수도 있는) 가장 높은 위험으로 보는 것에 투표할 수 있다. +따라서 데이터가 불완전하기 때문에 10개 카테고리 중 8개만 데이터에서 선정한다. 나머지 2개 카테고리는 Top 10 커뮤니티 설문조사에서 도출되었다. 이를 통해 현장 실무자들이 데이터에 포함되지 않거나 데이터로 표현되기 어려운 주요 위험에 대해 직접 투표할 수 있도록 하였다. ## 데이터 제공자에게 감사를 전한다 -다음 조직들(그리고 익명의 기부자들)이 280만 개 이상의 애플리케이션 데이터를 기꺼이 제공해 주었으며, 이를 통해 가장 크고 포괄적인 애플리케이션 보안 데이터셋을 구축할 수 있었다. 여러분의 도움 없이는 불가능했을 것이다. +**** +다음 조직들은 익명 기부자 다수와 함께 280만 건 이상의 애플리케이션 데이터를 제공하여 역대 가장 방대하고 포괄적인 애플리케이션 보안 데이터셋 구축에 기여하였다. 이들의 도움 없이는 불가능한 작업이었다. * Accenture (Prague) * Anonymous (multiple) From 7915e6ce5ce82db2bd59a2ceea17bb95361c2c4c Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Sun, 28 Dec 2025 09:12:22 +0900 Subject: [PATCH 014/167] Changes --- 2025/docs/kr/0x00_2025-Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index dcc8711fc..c18f968b8 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -27,7 +27,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ## 2025년 Top 10의 변화 -2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성으로 인해, 일정 수준의 중복 없이 10개의 카테고리를 구성하는 것은 사실상 불가능하다. +2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능하다. ![Mapping](../assets/2025-mappings.png) # OWASP Top 10 2025 From c6fb98cb28c9ad2d3d55ae46d9dcb0d97ef9491f Mon Sep 17 00:00:00 2001 From: Seongjin Hong <107898929+Seongjin-hong@users.noreply.github.com> Date: Sun, 28 Dec 2025 10:40:58 +0900 Subject: [PATCH 015/167] Reflect review comments --- 2025/docs/ko/0x01_2025-About_OWASP.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index 1606c07b9..723e15a27 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -5,7 +5,7 @@ OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있다. - 애플리케이션 보안 도구 및 표준 -- 선도적인 연구 +- 최첨단 연구 - 표준 보안통제 항목 및 라이브러리 - 애플리케이션 보안 테스팅, 시큐어 코딩, 코드 보안 리뷰에 관한 서적 - 프레젠테이션 및 [동영상](https://www.youtube.com/user/OWASPGLOBAL) @@ -18,11 +18,11 @@ OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있 OWASP의 모든 도구, 문서, 동영상, 프레젠테이션을 애플리케이션 보안 개선에 관심이 있는 누구나 자유롭게 이용하고 공유할 수 있도록 공개하고 있다. 각 지역 챕터의 생성 및 참여도 자유롭게 가능하다. -OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역에서 개선이 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. +OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역을 개선 하는 게 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. -OWASP는 조금 다른 성격의 조직이다. 상업적 이해관계에서 벗어나 있기 때문에, 애플리케이션 보안에 관해 편향되지 않고 실질적이며 비용적으로 효율적인 정보를 제공하고 있다. +OWASP는 일반적인 조직과는 다른 성격을 지닌다. 상업적 이해관계에서 자유롭기 때문에 편향되지 않으며 실용적이며 비용 효율적인 애플리케이션 보안 정보를 제공할 수 있다. -OWASP는 특정 기술 기업과 제휴하지 않지만, 상용 보안 기술의 올바른 활용을 지지한다. OWASP는 여러 자료를, 협력을 통해 투명하며 개방적인 방식으로 제작한다. +OWASP는 특정 기술 기업과 제휴하지 않지만, 상용 보안 기술의 올바른 활용을 지지한다. OWASP는 다양한 유형의 자료를, 협력을 통해 투명하며 개방적인 방식으로 제작한다. OWASP 재단은 프로젝트의 지속적인 발전을 뒷받침하는 비영리 단체다. OWASP에는 이사회부터 지부 리더, 프로젝트 구성원까지 대부분이 자원봉사자로 참여하고 있으며, 기존의 틀을 깨는 보안 연구를 후원하고 필요한 인프라를 제공한다. From 9c36d10cc1a0dc8e85ff53d1a19842b255295e32 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 28 Dec 2025 15:58:42 +0900 Subject: [PATCH 016/167] Add 0x03 file to ko directory --- ...g_a_Modern_Application_Security_Program.md | 307 ++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md new file mode 100644 index 000000000..7ae94c703 --- /dev/null +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -0,0 +1,307 @@ +# Establishing a Modern Application Security Program + +The OWASP Top Ten lists are awareness documents, meant to bring awareness to the most critical risks of whichever topic they cover. They are not meant to be a complete list, only a starting place. In previous versions of this list we have prescribed starting an application security program as the best way to avoid these risks, and more. In this section we will cover how to start and build a modern application security program. + + + +If you already have an application security program, consider performing a maturity assessment on it using [OWASP SAMM (Software Assurance Maturity Model)](https://owasp.org/www-project-samm/) or DSOMM (DevSecOps Maturity Model) . These maturity models are comprehensive and exhaustive and can be used to help you figure out where you should best focus your efforts for expanding and maturing your program. Please note: you do not need to do everything in OWASP SAMM or DSOMM to be doing a good job, they are meant to guide you and offer many options. They are not meant to offer unattainable standards or describe unaffordable programs. They are expansive in order to offer you many ideas and options. + + + +If you are starting a program from scratch, or you find OWASP SAMM or DSOMM ‘too much’ for your team right now, please review the following advice. + + +### 1. Establish a Risk Based Portfolio Approach: + +* Identify the protection needs of your application portfolio from a business perspective. This should be driven in part by privacy laws and other regulations relevant to the data asset being protected. + +* Establish a [common risk rating model](https://owasp.org/www-community/OWASP_Risk_Rating_Methodology) with a consistent set of likelihood and impact factors reflective of your organization’s tolerance for risk. + + +* Accordingly measure and prioritize all your applications and APIs. Add the results to your [Configuration Management Database (CMDB)](https://de.wikipedia.org/wiki/Configuration_Management_Database). + +* Establish assurance guidelines to properly define coverage and level of rigor required. + + +### 2. Enable with a Strong Foundation: + +* Establish a set of focused policies and standards that provide an application security baseline for all development teams to adhere to. + +* Define a common set of reusable security controls that complement these policies and standards and provide design and development guidance on their use. + +* Establish an application security training curriculum that is required and targeted to different development roles and topics. + + +### 3. Integrate Security into Existing Processes: + +* Define and integrate secure implementation and verification activities into existing development and operational processes. + +* Activities include threat modeling, secure design and design review, secure coding and code review, penetration testing, and remediation. + +* Provide subject matter experts and support services for development and project teams to be successful. + +* Review your current system development life cycle and all software security activities, tooling, policies, and processes, then document them. + +* For new software, add one or more security activities to each phase of the system development life cycle (SDLC). Below we offer many suggestions of what you can do below. Ensure you perform these new activities on every new project or software initiative, this way you will know each new piece of software will be delivered at an acceptable security posture for your organizations. + +* Select your activities to ensure your final product meets an acceptable level of risk for your organization. + +* For existing software (sometimes called legacy) you will want to have a formal maintenance plan, please look below for ideas of how to maintain secure applications in the section called 'Operations and Change Management'. + + +### 4. Application Security Education: + +* Consider starting a security champion program, or general security education program for your developers (sometimes called an advocacy or security awareness program), to teach them everything you wish they would know. This will keep them up to date, help them know how to do their work securely, and make the security culture where you work more positive. It often also improves trust between the teams and makes for a happier working relationship. OWASP supports you in this with the [OWASP Security Champions Guide](https://securitychampions.owasp.org/), which is being expanded step by step. + +* The OWASP Education Project provides training materials to help educate developers on web application security. For hands-on learning about vulnerabilities, try the [OWASP Juice Shop Project](https://owasp.org/www-project-juice-shop/), or [OWASP WebGoat](https://owasp.org/www-project-webgoat/). To stay current, come to an [OWASP AppSec Conference](https://owasp.org/events/), [OWASP Conference Training](https://owasp.org/events/), or local [OWASP Chapter](https://owasp.org/chapters/) meetings. + + +### 5. Provide Management Visibility: + +* Manage with metrics. Drive improvement and funding decisions based on the metrics and analysis data captured. Metrics include adherence to security practices and activities, vulnerabilities introduced, vulnerabilities mitigated, application coverage, defect density by type and instance counts, etc. + +* Analyze data from the implementation and verification activities to look for root cause and vulnerability patterns to drive strategic and systemic improvements across the enterprise. Learn from mistakes and offer positive incentives to promote improvements. + + + +## Establish & Use Repeatable Security Processes and Standard Security Controls + +### Requirements and Resource Management Phase: + +* Collect and negotiate the business requirements for an application with the business, including the protection requirements with regard to confidentiality, authenticity, integrity and availability of all data assets, and the expected business logic. + +* Compile the technical requirements including functional and nonfunctional security requirements. OWASP recommends you use the [OWASP Application Security Verification Standard (ASVS)(https://owasp.org/www-project-application-security-verification-standard/) as a guide for setting the security requirements for your application(s). + +* Plan and negotiate the budget that covers all aspects of design, build, testing and operation, including security activities. + +* Add security activities to your project schedule. + +* Introduce yourself as the security representative at the project kick off, so they know who to talk to. + + +### Request for Proposals (RFP) and Contracting: + +* Negotiate the requirements with internal or external developers, including guidelines and security requirements with respect to your security program, e.g. SDLC, best practices. + +* Rate the fulfillment of all technical requirements, including a planning and design phase. + +* Negotiate all technical requirements, including design, security, and service level agreements (SLA). + +* Adopt templates and checklists, such as [OWASP Secure Software Contract Annex](https://owasp.org/www-community/OWASP_Secure_Software_Contract_Annex).
**Note:** *The annex is for US contract law, so please consult qualified legal advice before using the sample annex.* + + +### Planning and Design Phase: + +* Negotiate planning and design with the developers and internal shareholders, e.g. security specialists. + +* Define the security architecture, controls, countermeasures and design reviews appropriate to the protection needs and the expected threat level. This should be supported by security specialists. + +* Rather than retrofitting security into your applications and APIs, it is far more cost effective to design the security in from the start. OWASP recommends the [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/index.html) and the [OWASP Proactive Controls](https://top10proactive.owasp.org/) as a good starting point for guidance on how to design security included from the beginning. + +* Perform threat modelling, see [OWASP Cheat Sheet: Threat Modeling](https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html). + +* Teach your software architects secure design concepts and patterns and ask them to add them to their designs where possible. + +* Examine data flows with your developers. + +* Add security user stories alongside all of your other user stories. + + +### Secure Development Lifecycle: + + +* To improve the process your organization follows when building applications and APIs, OWASP recommends the [OWASP Software Assurance Maturity Model (SAMM)](https://owasp.org/www-project-samm/). This model helps organizations formulate and implement a strategy for software security that is tailored to the specific risks facing their organization. + +* Provide secure coding training to your software developers, and any other training you think will help them create more robust and secure applications. + +* Code review, see [OWASP Cheat Sheet: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html). + +* Give your developers security tools, then teach them how to use them, especially static analysis, software composition analysis, secret, and [Infrastructure-as-Code (IaC)](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) scanners. + +* Create guardrails for your developers, if possible (technical safeguards to steer them towards more secure choices). + +* Building strong and usable security controls is difficult. Offer secure defaults whenever possible, and create ‘paved roads’ (making the easiest way also the most secure way to do something, the obvious preferred way) whenever possible. The [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/index.html) are a good starting point for developers, and many modern frameworks now come with standard and effective security controls for authorization, validation, CSRF prevention, etc. + +* Give your developers security-related IDE plugins and encourage them to use them. + +* Provide them a secret management tool, licenses, and documentation on how to use it. + +* Provide them a private AI to use, ideally set up with a RAG server full of useful security documentation, prompts your team has written for better outcomes, and an MCP server that calls the security tooling of choice for your org. Teach them how to use AI safely, because they are going to do it whether you like it or not. + + +### Establish Continuous Application Security Testing: + +* Test the technical functions and integration with the IT architecture and coordinate business tests. + +* Create “use” and “abuse” test cases from technical and business perspectives. + +* Manage security tests according to internal processes, the protection needs, and the assumed threat level by the application. + +* Provide security testing tools (fuzzers, DAST, etc.), a safe place to test, and training on how to use them, OR do the testing for them OR hire a tester + +* If you require a high level of assurance, consider a formal penetration test, as well as stress testing and performance testing. + +* Work with your developers to help them decide what they need to fix from the bug reports, and ensure their managers give them time to do it. + + +### Rollout: + +* Put the application in operation and migrate from previously used applications if needed. + +* Finalize all documentation, including the change management database (CMDB) and security architecture. + + +### Operations and Change Management: + +* Operations must include guidelines for the security management of the application (e.g. patch management). + +* Raise the security awareness of users and manage conflicts about usability vs. security. + +* Plan and manage changes, e.g. migrate to new versions of the application or other components like OS, middleware, and libraries. + +* Ensure all apps are in your inventory, with all important details documented. Update all documentation, including in the CMDB and the security architecture, controls, and countermeasures, including any runbooks or project documentation. + +* Perform logging, monitoring, and alerting for all apps. Add it if it’s missing. + +* Create processes for effective and efficient updating and patching. + +* Create regular scanning schedules (hopefully dynamic, static, secrets, IaC, and software composition analysis). + +* SLAs for fixing security bugs. + +* Provide a way for employees (and ideally also your customers) to report bugs. + +* Establish a trained incident response team that understands what software attacks look like, observability tooling. + +* Run blocking or shielding tools to stop automated attacks. + +* Annual (or more often) hardening of configurations. + +* At least annual penetration testing (depending upon the level assurance required for your app). + +* Establish processes and tooling for hardening and protecting your software supply chain. + +* Establish and update business continuity and disaster recovery planning that includes your most important applications and the tools you use to maintain them. + + +### Retiring Systems: + +* Any required data should be archived. All other data should be securely wiped. + +* Securely retire the application, including deleting unused accounts and roles and permissions. + +* Set your application’s state to retired in the CMDB. + + +## Using the OWASP Top 10 as a standard + +The OWASP Top 10 is primarily an awareness document. However, this has not stopped organizations from using it as a de facto industry AppSec standard since its inception in 2003. If you want to use the OWASP Top 10 as a coding or testing standard, know that it is the bare minimum and just a starting point. + +One of the difficulties of using the OWASP Top 10 as a standard is that we document AppSec risks, and not necessarily easily testable issues. For example, [A06:2025-Insecure Design](A06_2025-Insecure_Design.md) is beyond the scope of most forms of testing. Another example is testing whether in-place, in-use, and effective logging and monitoring are implemented, which can only be done with interviews and requesting a sampling of effective incident responses. A static code analysis tool can look for the absence of logging, but it might be impossible to determine if business logic or access control is logging critical security breaches. Penetration testers may only be able to determine that they have invoked incident response in a test environment, which is rarely monitored in the same way as production. + +Here are our recommendations for when it is appropriate to use the OWASP Top 10: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Use Case + OWASP Top 10 2025 + OWASP Application Security Verification Standard +
Awareness + Yes + +
Training + Entry level + Comprehensive +
Design and architecture + Occasionally + Yes +
Coding standard + Bare minimum + Yes +
Secure Code review + Bare minimum + Yes +
Peer review checklist + Bare minimum + Yes +
Unit testing + Occasionally + Yes +
Integration testing + Occasionally + Yes +
Penetration testing + Bare minimum + Yes +
Tool support + Bare minimum + Yes +
Secure Supply Chain + Occasionally + Yes +
+ + +We would encourage anyone wanting to adopt an application security standard to use the [OWASP Application Security Verification Standard](https://owasp.org/www-project-application-security-verification-standard/) (ASVS), as it’s designed to be verifiable and tested, and can be used in all parts of a secure development lifecycle. + +The ASVS is the only acceptable choice for tool vendors. Tools cannot comprehensively detect, test, or protect against the OWASP Top 10 due to the nature of several of the OWASP Top 10 risks, with reference to [A06:2025-Insecure Design](A06_2025-Insecure_Design.md). OWASP discourages any claims of full coverage of the OWASP Top 10, because it’s simply untrue. From 63681f64358c20c66d947ef0e5146c0b1da6c3d6 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Sun, 28 Dec 2025 17:54:00 +0900 Subject: [PATCH 017/167] Translate 2025 OWASP TOP 10 Broken Access Control to korean Version 1.0 --- ...1\352\267\274 \355\206\265\354\240\234.md" | 216 ++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 "2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" diff --git "a/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" "b/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" new file mode 100644 index 000000000..b8fa3e7be --- /dev/null +++ "b/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" @@ -0,0 +1,216 @@ +# A01:2025 실패한 접근 통제 ![icon](../assets/TOP_10_Icons_Final_Broken_Access_Control.png){: style="height:80px;width:80px" align="right"} + + + +## 배경(Background). + +실패한 접근통제는 OWASP TOP 10에서 1위를 유지있다. 100%의 테스트된 애플리케이션에서 실패한 접근 통제 취약점이 발견되었으며, 관심이 갈만한 보안약점(CWE)은 CWE-200: 비인기자에게 민감정보 노출, CWE-201: 전송된 데이터로부터 민감정보 노출, CWE-918: 서버측 요청 위조(SSRF), 그리고 CWE-352: 크로스 사이트 요청 위조(CSRF) 가 있다. 이번 카테고리는 제공받은 데이터로부터 높은 발생률을 보이며, 두번째로 높은 관련된 CVE 개수를 보유하고 있다. + +## 점수표(Score Table). + + + + + + + + + + + + + + + + + + + + + + + + + +
매칭된 CWEs + 최대 사고 발생률 + 평균 사고 발생률 + 최대 커버리지(범위) + 평균 커버리지(범위) + 평균 공격 심각도 + 평균 영향도 + 총 발생률 + 총 CVE 개수 +
40 + 20.15% + 3.74% + 100.00% + 42.93% + 7.04 + 3.84 + 1,839,701 + 32,654 +
+ + + +## 설명(Description). + +접근통제는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 실패된 접근통제는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제(파괴), 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔한 접근 통제 취약점은 리스트는 다음과 같다: + +- 최소 권한 원칙 위반, 흔히 알려진 기본적 우선 거부(Deny by Default)는 오직 허가된 기능, 역할, 사용자들에게만 허용된 자원 접근이 가능해야 한다. 그러나 모두에게 허가되거나 권한이 필요없는 자에게도 권한이 부여된 것을 최소 권한 원칙 위반이라 한다. +- 수정된 URL, 내부 애플리케이션 상태, HTML 페이지 또는 공격 도구를 이용한 수정된 API 요청을 이용한 접근통제 우회 체크(파라미터 위조 또는 브라우징 강제) +* 다른 사용자 계정을 조회 또는 수정할 수 있는 고유 식별자 제공(안전하지 않은 직접 객체 참조, Insecure Direct Object References) +* POST, PUT 그리고 DELETE에 대한 접근 가능한 API에 접근 통제 로직이 없는 경우 +* 권한 상승. 로그인 과정 없이 다른 유저로 가장하거나 또는 사용자가 보유한 이상의 권한을 획득하는 것(예시. 관리자 접근 권한) +* 메타데이터 위조, JSON 웹 토큰(JWT), 접근 통제 토큰, 쿠키 또는 히든 필드 값을 수정하여 재전송 또는 위조함으로써 권한 상승을 하는 경우 또는 JWT 무효화 남용하는 경우 +* 교차 출처 자원 공유 (CORS, Cross-Origin Resource Sharing)의 잘못된 설정은 비인가자 또는 비신뢰 출처로부터 API 접근을 허용한다. +* 브라우징 강제 (URL 예측)는 인증이 필요한 페이지에 인증없이 접근하거나, 권한이 필요한 페이지에 일반 유저가 접근하는 것을 말한다. + + +## 방어(Prevent). + +접근통제는 공격자가 접근 통제 로직 또는 메타데이터를 수정할 수 없는 곳에서 신뢰할 수 있는 서버측 코드나 서버리스 API들로 구현될 때 효과적이다. + + + +* 공개 리소스 제외 모든 리소스는 거부 우선 정책(Deny By Default)을 따를 것 +* 접근통제 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 자원 검증 사용 최소화 할 것 +* 모델 접근 통제는 소유권에 의해 행해져야 하며, 다른 사용자에 의해 레코드 생성, 읽기, 갱신, 삭제가 이루어져선 안 된다.(DAC, 임의 접근 통제) +* 유니크 애플리케이션 비즈니스 요구사항 제한은 도메인 모델에 의해 강제되어야 한다.(Unique application business limit requirements should be enforced by domain models.) +* 웹 서버 디렉토리 리스팅 비활성화 여부, 파일 메타데이터 검증(예시. .git 디렉토리), 그리고 백업 파일이 웹 루트에 존재하는지 확인해야 한다. +* 접근 통제 실패 로그 기록 및 적절한 경우엔 관리자에게 경고 알림 (예시. 반복적 실패 또는 비정상적 접근 시도) +* API 및 컨트롤러 속도 제한 구현 하여 자동화된 공격 툴 피해 최소화 +* 상태기반 세션 식별자는 로그아웃 후 무효화되어야 합니다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격자를 위한 공격 표면 및 기회를 최소화해야 하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려해야 하며, OAuth 표준에 따른 토큰 취소도 고려하여야 한다. +* 간단하고 선언적 접근 통제를 제공하는 확립된 툴킷과 패턴을 사용해야 한다. +* 개발자와 QA 스태프는 보유 중인 시스템과 통합적 테스트에서 함수적 접근 통제을 포함하여야 한한다. +## 예시 공격 시나리오. + +**시나리오 1:** 어떤 애플리케이션은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다: + + +``` +pstmt.setString(1, request.getParameter("acct")); +ResultSet results = pstmt.executeQuery( ); +``` + + +공격자는 원하는 계정 정보를 전달하기 위해 간단하게 'acct' 파라미터를 변조할 수 있으며, 만약 해당 파라미터가 완벽하게 검증되지 않았을 시 공격자는 모든 사용자 계정 정보에 접근 가능하다. + + +``` +https://example.com/app/accountInfo?acct=notmyacct +``` + + +**시나리오 2:** 공격자는 간단하게 목적 URL 브라우징을 강제할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. + + +``` +https://example.com/app/getappInfo +https://example.com/app/admin_getappInfo +``` + + +먄약 인정되지 않은 유저가 해당 페이지(/app/getappInfo) 접근이 가능하다면, 이건 보안 취약점으로 간주되고, 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이것도 보안 취약점으로 간주된다.(/app/admin_getappInfo) + +**시나리오 3:** 애플리케이션이 프론트 엔드에서만 접근 제어를 하는 경우. 공격자가 브라우저에서 동작하는 자바 스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없다면, 커멘드 라인에서 간단하게 curl 명령어를 실행하면 된다: + +``` +$ curl https://example.com/app/admin_getappInfo +``` + + + + +## 참조. + +* [OWASP 사전 활성화 통제: C1: 접근 통제 구현](https://top10proactive.owasp.org/archive/2024/the-top-10/c1-accesscontrol/) +* [OWASP 애플리케이션 보안 검증 표준: V8 인가](https://github.com/OWASP/ASVS/blob/master/5.0/en/0x17-V8-Authorization.md) +* [OWASP 테스트 가이드: 인증 테스트](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/README) +* [OWASP 치트시트: 인증](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html) +* [PortSwigger: CORS 잘못된 설정 공격](https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties) +* [OAuth: 접근 취소](https://www.oauth.com/oauth2-servers/listing-authorizations/revoking-access/) + + +## 매핑된 보안약점 (CWEs) 리스트 + +* [CWE-22 제한된 디렉토리의 적절하지 않은 경로 이름('경로 조작')](https://cwe.mitre.org/data/definitions/22.html) + +* [CWE-23 상대적 경로 조작](https://cwe.mitre.org/data/definitions/23.html) + +* [CWE-36 절대적 경로 조작](https://cwe.mitre.org/data/definitions/36.html) + +* [CWE-59 파일 접근 전 적절하지 않은 링크 해석 ('링크 따라가기(following)')](https://cwe.mitre.org/data/definitions/59.html) + +* [CWE-61 윤닉스 심볼릭 링크 따라가기(following)](https://cwe.mitre.org/data/definitions/61.html + +* [CWE-65 윈도우즈 하드 링크](https://cwe.mitre.org/data/definitions/65.html) + +* [CWE-200 비인가자에게 민감 데이터 노출](https://cwe.mitre.org/data/definitions/200.html) + +* [CWE-201 전달된 데이터로부터 민감 데이터 노출](https://cwe.mitre.org/data/definitions/201.html) + +* [CWE-219 웹 루트 내 민감 데이터 저장](https://cwe.mitre.org/data/definitions/219.html) + +* [CWE-276 부적절한 기본 권한 설정](https://cwe.mitre.org/data/definitions/276.html) + +* [CWE-281 부적절한 권한 상태 유지](https://cwe.mitre.org/data/definitions/281.html) + +* [CWE-282 부적절한 소유권 관리](https://cwe.mitre.org/data/definitions/282.html) + +* [CWE-283 검증되지 않은 소유권](https://cwe.mitre.org/data/definitions/283.html) + +* [CWE-284 부적절한 접근 통제](https://cwe.mitre.org/data/definitions/284.html) + +* [CWE-285 부적절한 인가](https://cwe.mitre.org/data/definitions/285.html) + +* [CWE-352 크로스 사이트 요청 위조 (CSRF)](https://cwe.mitre.org/data/definitions/352.html) + +* [CWE-359 비인가자에게 개인정보 유출](https://cwe.mitre.org/data/definitions/359.html) + +* [CWE-377 안전하지 않은 임시 파일](https://cwe.mitre.org/data/definitions/377.html) + +* [CWE-379 안전하지 않은 권한이 부여된 디렉토리에 임시 파일 생성](https://cwe.mitre.org/data/definitions/379.html) + +* [CWE-402 새로운 영역 내 내부 자원 전달('자원 유출')](https://cwe.mitre.org/data/definitions/402.html) + +* [CWE-424 대체 경로에 대한 부적절한 보호](https://cwe.mitre.org/data/definitions/424.html) + +* [CWE-425 직접 요청 ('브라우징 강제')](https://cwe.mitre.org/data/definitions/425.html) + +* [CWE-441 의도되지 않은 프록시 또는 중간자](https://cwe.mitre.org/data/definitions/441.html) + +* [CWE-497 비인가자 통제 영역에 민감 시스템 정보 노출](https://cwe.mitre.org/data/definitions/497.html) + +* [CWE-538 외부 접근 가능한 파일 또는 디렉토리에 민감 데이터 삽입](https://cwe.mitre.org/data/definitions/538.html) + +* [CWE-540 소스코드 내 포함된 민감 데이터](https://cwe.mitre.org/data/definitions/540.html) + +* [CWE-548 디렉토리 리스팅을 통한 민감 데이터 노출](https://cwe.mitre.org/data/definitions/548.html) + +* [CWE-552 외부로부터 접근 가능한 파일 또는 디렉토리](https://cwe.mitre.org/data/definitions/552.html) + +* [CWE-566 사용자 통제 가능한 SQL 기본키를 통한 인가 우회](https://cwe.mitre.org/data/definitions/566.html) + +* [CWE-601 신뢰할 수 없는 사이트로의 URL 리다이렉션 ('오픈 리다이렉션')](https://cwe.mitre.org/data/definitions/601.html) + +* [CWE-615 소스코드 주석 내 민감 데이터 포함](https://cwe.mitre.org/data/definitions/615.html) + +* [CWE-639 사용자 통제 가능한 키를 통한 인가 우회](https://cwe.mitre.org/data/definitions/639.html) + +* [CWE-668 잘못된 영역으로 자원 유출](https://cwe.mitre.org/data/definitions/668.html) + +* [CWE-732 중요 리소스에 부적절한 권한 할당](https://cwe.mitre.org/data/definitions/732.html) + +* [CWE-749 위험한 메소드 및 함수 노출](https://cwe.mitre.org/data/definitions/749.html) + +* [CWE-862 인가 누락](https://cwe.mitre.org/data/definitions/862.html) + +* [CWE-863 부적절한 인가](https://cwe.mitre.org/data/definitions/863.html) + +* [CWE-918 서버측 요청 위조 (SSRF)](https://cwe.mitre.org/data/definitions/918.html) + +* [CWE-922 안전하지 않은 저장소 내 민감 데이터](https://cwe.mitre.org/data/definitions/922.html) + +* [CWE-1275 부적절한 SameSite 속성이 부여된 민감 쿠키](https://cwe.mitre.org/data/definitions/1275.html) From c4921dad5be78d8c99ff4ff61193492f86d5bf97 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Sun, 28 Dec 2025 18:02:26 +0900 Subject: [PATCH 018/167] Translate 2025 OWASP TOP 10 Broken Access Control to korean Version 1.1 --- ...1\352\267\274 \355\206\265\354\240\234.md" | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git "a/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" "b/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" index b8fa3e7be..7ba55b257 100644 --- "a/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" +++ "b/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" @@ -58,14 +58,14 @@ 접근통제는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 실패된 접근통제는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제(파괴), 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔한 접근 통제 취약점은 리스트는 다음과 같다: -- 최소 권한 원칙 위반, 흔히 알려진 기본적 우선 거부(Deny by Default)는 오직 허가된 기능, 역할, 사용자들에게만 허용된 자원 접근이 가능해야 한다. 그러나 모두에게 허가되거나 권한이 필요없는 자에게도 권한이 부여된 것을 최소 권한 원칙 위반이라 한다. -- 수정된 URL, 내부 애플리케이션 상태, HTML 페이지 또는 공격 도구를 이용한 수정된 API 요청을 이용한 접근통제 우회 체크(파라미터 위조 또는 브라우징 강제) -* 다른 사용자 계정을 조회 또는 수정할 수 있는 고유 식별자 제공(안전하지 않은 직접 객체 참조, Insecure Direct Object References) +- 최소 권한 원칙 위반, 흔히 알려진 기본적 우선 거부(Deny by Default)는 오직 허가된 기능, 역할, 사용자들에게만 허용된 자원 접근이 가능해야 한다. 그러나 모두에게 허가되거나 권한이 필요없는 자에게도 권한이 부여된 경우 +- 수정된 URL, 내부 애플리케이션 상태, HTML 페이지 또는 공격 도구를 이용한 수정된 API 요청을 이용한 접근통제 우회가 가능한 경우(파라미터 위조 또는 브라우징 강제) +* 다른 사용자 계정을 조회 또는 수정할 수 있는 고유 식별자 제공하는 경우(안전하지 않은 직접 객체 참조, Insecure Direct Object References) * POST, PUT 그리고 DELETE에 대한 접근 가능한 API에 접근 통제 로직이 없는 경우 -* 권한 상승. 로그인 과정 없이 다른 유저로 가장하거나 또는 사용자가 보유한 이상의 권한을 획득하는 것(예시. 관리자 접근 권한) +* 권한 상승. 로그인 과정 없이 다른 유저로 가장하거나 또는 사용자가 보유한 이상의 권한을 획득가능한 경우(예시. 관리자 접근 권한) * 메타데이터 위조, JSON 웹 토큰(JWT), 접근 통제 토큰, 쿠키 또는 히든 필드 값을 수정하여 재전송 또는 위조함으로써 권한 상승을 하는 경우 또는 JWT 무효화 남용하는 경우 -* 교차 출처 자원 공유 (CORS, Cross-Origin Resource Sharing)의 잘못된 설정은 비인가자 또는 비신뢰 출처로부터 API 접근을 허용한다. -* 브라우징 강제 (URL 예측)는 인증이 필요한 페이지에 인증없이 접근하거나, 권한이 필요한 페이지에 일반 유저가 접근하는 것을 말한다. +* 교차 출처 자원 공유 (CORS, Cross-Origin Resource Sharing)의 잘못된 설정으로 비인가자 또는 비신뢰 출처로부터 API 접근을 허용하는 경우 +* 브라우징 강제 (URL 예측)로 인증이 필요한 페이지에 인증없이 접근하거나, 권한이 필요한 페이지에 일반 유저가 접근하는 경우 ## 방어(Prevent). @@ -74,16 +74,18 @@ -* 공개 리소스 제외 모든 리소스는 거부 우선 정책(Deny By Default)을 따를 것 -* 접근통제 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 자원 검증 사용 최소화 할 것 +* 공개 리소스 제외 모든 리소스는 거부 우선 정책(Deny By Default)을 따라야 한다. +* 접근통제 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 자원 검증 사용 최소화해야 한다. * 모델 접근 통제는 소유권에 의해 행해져야 하며, 다른 사용자에 의해 레코드 생성, 읽기, 갱신, 삭제가 이루어져선 안 된다.(DAC, 임의 접근 통제) -* 유니크 애플리케이션 비즈니스 요구사항 제한은 도메인 모델에 의해 강제되어야 한다.(Unique application business limit requirements should be enforced by domain models.) +* 애플리케이션의 고유한 비즈니스 요구사항 제한은 도메인 모델에 의해 강제되어야 한다. * 웹 서버 디렉토리 리스팅 비활성화 여부, 파일 메타데이터 검증(예시. .git 디렉토리), 그리고 백업 파일이 웹 루트에 존재하는지 확인해야 한다. -* 접근 통제 실패 로그 기록 및 적절한 경우엔 관리자에게 경고 알림 (예시. 반복적 실패 또는 비정상적 접근 시도) -* API 및 컨트롤러 속도 제한 구현 하여 자동화된 공격 툴 피해 최소화 -* 상태기반 세션 식별자는 로그아웃 후 무효화되어야 합니다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격자를 위한 공격 표면 및 기회를 최소화해야 하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려해야 하며, OAuth 표준에 따른 토큰 취소도 고려하여야 한다. +* 접근 통제 실패 로그 기록 및 적절한 경우엔 관리자에게 경고 알림하여야 한다. (예시. 반복적 실패 또는 비정상적 접근 시도) +* API 및 컨트롤러 속도 제한 구현 하여 자동화된 공격 툴 피해 최소화해야 한다. +* 상태기반 세션 식별자는 로그아웃 후 무효화되어야 한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격자를 위한 공격 표면 및 기회를 최소화해야 하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려해야 하며, OAuth 표준에 따른 토큰 취소도 고려하여야 한다. * 간단하고 선언적 접근 통제를 제공하는 확립된 툴킷과 패턴을 사용해야 한다. -* 개발자와 QA 스태프는 보유 중인 시스템과 통합적 테스트에서 함수적 접근 통제을 포함하여야 한한다. + +개발자와 QA 스태프는 보유 중인 시스템과 통합적 테스트에서 함수적 접근 통제을 포함하여야 한다. + ## 예시 공격 시나리오. **시나리오 1:** 어떤 애플리케이션은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다: @@ -112,9 +114,9 @@ https://example.com/app/admin_getappInfo ``` -먄약 인정되지 않은 유저가 해당 페이지(/app/getappInfo) 접근이 가능하다면, 이건 보안 취약점으로 간주되고, 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이것도 보안 취약점으로 간주된다.(/app/admin_getappInfo) +먄약 인증되지 않은 유저가 해당 페이지(/app/getappInfo) 접근이 가능하다면, 이건 보안 취약점으로 간주되고, 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이것도 보안 취약점으로 간주된다.(/app/admin_getappInfo) -**시나리오 3:** 애플리케이션이 프론트 엔드에서만 접근 제어를 하는 경우. 공격자가 브라우저에서 동작하는 자바 스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없다면, 커멘드 라인에서 간단하게 curl 명령어를 실행하면 된다: +**시나리오 3:** 애플리케이션이 프론트 엔드에서만 접근 제어를 하는 경우. 공격자는 브라우저에서 동작하는 자바 스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없다. 이때 커멘드 라인에서 간단하게 curl 명령어를 실행하면 된다: ``` $ curl https://example.com/app/admin_getappInfo @@ -143,7 +145,7 @@ $ curl https://example.com/app/admin_getappInfo * [CWE-59 파일 접근 전 적절하지 않은 링크 해석 ('링크 따라가기(following)')](https://cwe.mitre.org/data/definitions/59.html) -* [CWE-61 윤닉스 심볼릭 링크 따라가기(following)](https://cwe.mitre.org/data/definitions/61.html +* [CWE-61 유닉스 심볼릭 링크 따라가기(following)](https://cwe.mitre.org/data/definitions/61.html) * [CWE-65 윈도우즈 하드 링크](https://cwe.mitre.org/data/definitions/65.html) From 07a25980a1d57919c51c2032417d21069dfef61b Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Sun, 28 Dec 2025 18:05:44 +0900 Subject: [PATCH 019/167] Translate 2025 OWASP TOP 10 Broken Access Control to korean Version 1.2 --- ...34 \354\240\221\352\267\274 \355\206\265\354\240\234.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" "b/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" index 7ba55b257..0619b21f7 100644 --- "a/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" +++ "b/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" @@ -58,7 +58,7 @@ 접근통제는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 실패된 접근통제는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제(파괴), 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔한 접근 통제 취약점은 리스트는 다음과 같다: -- 최소 권한 원칙 위반, 흔히 알려진 기본적 우선 거부(Deny by Default)는 오직 허가된 기능, 역할, 사용자들에게만 허용된 자원 접근이 가능해야 한다. 그러나 모두에게 허가되거나 권한이 필요없는 자에게도 권한이 부여된 경우 +- 최소 권한 원칙 위반, 흔히 알려진 기본적 우선 거부(Deny by Default)는 오직 허가된 기능, 역할, 사용자들에게만 허용된 자원 접근이 가능하다. 그러나 모두에게 허가되거나 권한이 필요없는 자에게도 권한이 부여된 경우 취약하다 판단한다. - 수정된 URL, 내부 애플리케이션 상태, HTML 페이지 또는 공격 도구를 이용한 수정된 API 요청을 이용한 접근통제 우회가 가능한 경우(파라미터 위조 또는 브라우징 강제) * 다른 사용자 계정을 조회 또는 수정할 수 있는 고유 식별자 제공하는 경우(안전하지 않은 직접 객체 참조, Insecure Direct Object References) * POST, PUT 그리고 DELETE에 대한 접근 가능한 API에 접근 통제 로직이 없는 경우 @@ -76,7 +76,7 @@ * 공개 리소스 제외 모든 리소스는 거부 우선 정책(Deny By Default)을 따라야 한다. * 접근통제 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 자원 검증 사용 최소화해야 한다. -* 모델 접근 통제는 소유권에 의해 행해져야 하며, 다른 사용자에 의해 레코드 생성, 읽기, 갱신, 삭제가 이루어져선 안 된다.(DAC, 임의 접근 통제) +* 모델 접근 통제는 소유권에 의해 행해져야 하며, 다른 사용자에 의해 레코드 생성, 읽기, 갱신, 삭제가 이루어져선 안 된다. * 애플리케이션의 고유한 비즈니스 요구사항 제한은 도메인 모델에 의해 강제되어야 한다. * 웹 서버 디렉토리 리스팅 비활성화 여부, 파일 메타데이터 검증(예시. .git 디렉토리), 그리고 백업 파일이 웹 루트에 존재하는지 확인해야 한다. * 접근 통제 실패 로그 기록 및 적절한 경우엔 관리자에게 경고 알림하여야 한다. (예시. 반복적 실패 또는 비정상적 접근 시도) @@ -105,7 +105,7 @@ https://example.com/app/accountInfo?acct=notmyacct ``` -**시나리오 2:** 공격자는 간단하게 목적 URL 브라우징을 강제할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. +**시나리오 2:** 공격자는 간단하게 목적 URL로 브라우징을 강제할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. ``` From 89e02732f89b0a53e62e5854bf5437e97055d3ff Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Sun, 28 Dec 2025 19:36:13 +0900 Subject: [PATCH 020/167] revising the entire text for a more natural flow --- 2025/docs/kr/0x00_2025-Introduction.md | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index c18f968b8..d677956f6 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -32,24 +32,24 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ![Mapping](../assets/2025-mappings.png) # OWASP Top 10 2025 -**[A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 수집된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 보유하고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. -**[A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 수집된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 보유하고 있었다. 이는 소프트웨어 엔지니어링에서 설정에 기반한 애플리케이션 동작이 지속적으로 증가하고 있는 추세를 고려하면 예상 가능한 결과이다. -* **[A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md)**이 카테고리는 기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)를 확장한 것으로, 소프트웨어 종속성뿐 아니라 빌드 시스템과 배포 인프라 전반에 걸친 공급망 위협까지 포괄한다. 커뮤니티 설문에서 가장 우려되는 보안 이슈로 선정되었음에도, 실제 데이터에서는 발생 빈도가 가장 낮게 나타났다. 이는 위협이 적기 때문이 아니라 테스트 자체가 어렵기 때문이다. 현재 5개의 CWE가 매핑되어 있으며, 테스트 방법론이 발전함에 따라 더 많은 사례가 포착될 것으로 예상된다. 주목할 점은 발생 빈도는 낮지만 CVE 기준 익스플로잇 가능성과 영향도 점수가 가장 높다는 것이다. 한 번 발생하면 피해 규모가 크다는 의미이다. -* **[A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 계단 하락하였다. 수집된 데이터에 따르면 평균 3.80%의 애플리케이션에서 관련 CWE 32개 중 하나 이상이 발견되었다. 암호화 관련 취약점은 민감한 데이터 유출이나 시스템 침해로 이어지는 경우가 많아 여전히 주의가 필요한 영역이다. -* **[A05:2025 - Injection](A05_2025-Injection.md)**은 3위에서 5위로 두 계단 하락하였다. 인젝션은 가장 많이 테스트되는 카테고리 중 하나이며, 38개의 CWE가 매핑되어 있고 관련 CVE 수도 가장 많다. 이 카테고리에는 XSS(Cross-site Scripting)발생 빈도 높음/영향도 낮음)부터 SQL 인젝션(발생 빈도 낮음/영향도 높음)까지 다양한 유형의 취약점이 포함된다. +**[A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. +**[A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. +* **[A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md)**기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. +* **[A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. +* **[A05:2025 - Injection](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동은 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. * **[A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md)**은 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 계단 하락하였다. 이 카테고리는 2021년에 신설되었으며, 이후 업계에서 Threat Modeling 도입과 Secure Design에 대한 강조가 눈에 띄게 진전되었다. -* **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 카테고리에 포함된 36개의 CWE를 보다 정확하게 반영하기 위해 명칭이 변경되었다(기존 명칭 "[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)"). 이 카테고리는 여전히 중요하지만, 인증(Authentication)을 위한 표준화된 프레임워크 도입이 확산되면서 관련 취약점 발생이 감소하는 추세이다. -* **[A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md)**는 8위를 유지하였다. 이 카테고리는 Trust Boundary 유지 실패와 소프트웨어, 코드, 데이터 아티팩트의 무결성 검증 실패에 초점을 맞추고 있으며, Software Supply Chain Failures보다 낮은 수준의 무결성 문제를 다룬다. -* **[A09:2025 - Security Logging & Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 명칭: [Security Logging and Monitoring Failures](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)). 아무리 훌륭한 로깅을 갖추더라도 알람이 없으면 보안 사고 식별에 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에서 과소 대표되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 목록에 포함되었다. -**[A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 신설된 카테고리이다. 이 카테고리에는 부적절한 오류 처리, 논리적 오류, 실패 시 개방(Fail-open) 및 시스템이 직면할 수 있는 비정상적인 조건에서 발생하는 기타 시나리오에 초점을 맞춘 24개의 CWE가 포함되어 있다. +* **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다 +* **[A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 Software Supply Chain Failures보다 상대적으로 더 로우 레벨(Lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary) 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. +* **[A09:2025 - Security Logging & Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [Security Logging and Monitoring Failures](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)). 로그에서 발생한 이벤트에 대해 적절한 대응을 위한 알림(Alert) 기능의 중요성을 강조하기 위한 것이다. 알림 체계가 결여된 로깅은 보안 사고를 식별하는 데 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. +**[A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(Fail Open) 등 비정상적인 상태에서 비롯되는 24개 CWE를 포함하고 있다. ## 방법론 -이번 Top Ten은 데이터에 기반하되, 데이터에 맹목적으로 의존하지는 않는다. 수집된 데이터를 기반으로 12개 카테고리의 순위를 산정하였으며, 커뮤니티 설문조사 결과를 통해 2개 카테고리를 추가로 선정하거나 강조될 수 있도록 했다. 이러한 접근 방식을 채택한 근본적인 이유는, 수집된 데이터를 분석하는 것은 본질적으로 과거를 돌아보는 작업이기 때문이다.애플리케이션 보안 연구자들은 새로운 취약점을 발굴하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자하고 있다. 이러한 테스트를 도구와 프로세스에 통합하기까지는 몇 주에서 몇 년이 소요된다. 특정 취약점을 대규모로 신뢰성 있게 테스트할 수 있게 될 때쯤이면 이미 몇 년이 경과한 경우가 많다. 또한 신뢰성 있게 테스트하기가 어려워 데이터에 반영되지 않는 중요한 위험 항목도 존재한다.이러한 관점을 보완하기 위해, 우리는 현장에서 활동하는 애플리케이션 보안 및 개발 실무자들에게 커뮤니티 설문을 통해 테스트 데이터에서 충분히 반영되지 못하고 있는 핵심 위험 요소가 무엇이라고 생각하는지 묻는다. +이번 Top Ten은 데이터에 기반하되, 데이터에 맹목적으로 의존하지는 않는다. 수집된 데이터를 기반으로 12개 카테고리의 순위를 산정하였으며, 커뮤니티 설문조사 결과를 통해 2개 카테고리를 추가로 선정하거나 강조될 수 있도록 했다. 이러한 접근 방식을 채택한 근본적인 이유는, 수집된 데이터를 분석하는 것은 본질적으로 과거를 돌아보는 작업이기 때문이다. 애플리케이션 보안 연구자들은 새로운 취약점을 발굴하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자하고 있다. 이러한 테스트를 도구와 프로세스에 통합하기까지는 몇 주에서 몇 년이 소요된다. 특정 취약점을 대규모로 신뢰성 있게 테스트할 수 있게 될 때쯤이면 이미 몇 년이 경과한 경우가 많다. 또한 신뢰성 있게 테스트하기가 어려워 데이터에 반영되지 않는 중요한 위험 항목도 존재한다. 이러한 관점을 보완하기 위해, 우리는 현장에서 활동하는 애플리케이션 보안 및 개발 실무자들에게 커뮤니티 설문을 통해 테스트 데이터에서 충분히 반영되지 못하고 있는 핵심 위험 요소가 무엇이라고 생각하는지 확인한다. -## 카테고리의 구조화 방법 +## 카테고리 구성 방식 -이전 OWASP Top Ten에서 몇 가지 카테고리가 변경되었다. 다음은 카테고리 변경 사항에 대한 대략적인 요약이다. +이번 OWASP Top 10에서는 이전 버전과 비교하여 일부 카테고리가 변경되었다. 아래는 주요 변경 사항에 대한 요약이다. 이번 조사에서는 2021년 버전과 달리 CWE에 대한 제한 없이 데이터를 수집하였다. 특정 연도(2021년부터)에 테스트된 애플리케이션 수와 테스트에서 CWE가 하나 이상 발견된 애플리케이션 수를 요청하였다. 이 방식을 통해 각 CWE가 전체 애플리케이션 중 얼마나 널리 분포하는지 파악할 수 있다. 발생 빈도는 의도적으로 고려하지 않았는데, 이는 다른 상황에서는 유용할 수 있으나 전체 애플리케이션에서의 실제 발생률을 왜곡할 수 있기 때문이다. 애플리케이션에서 특정 CWE가 4건 발견되었든 4,000건 발견되었든 Top Ten 산정에는 영향을 미치지 않는다. 이는 Manual Tester가 동일한 취약점을 애플리케이션 내에서 여러 번 발견하더라도 한 번만 기록하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 모든 인스턴스를 개별적으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개에서 2021년 약 400개로, 이번 버전에서는 589개로 증가하였다. 향후 추가적인 데이터 분석을 보완 자료로 제공할 계획이다. CWE 수의 대폭 증가로 인해 카테고리 구조의 변경이 불가피하였다. @@ -58,7 +58,7 @@ CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이로 인해 Top Ten의 일부가 적용되지 않는 경우 도구 및 교육/인식 프로그램에 문제가 발생한다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 Injection, Command Injection, Cross-site Scripting, Hardcoded Passwords, Lack of Validation, Buffer Overflows, Cleartext Storage of Sensitive Information 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top Ten 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. -## 카테고리 선택을 위한 데이터 사용 방법 +## 카테고리 선정을 위한 데이터 사용법 2021년 버전과 마찬가지로 *Exploitability* 및 *(Technical) Impact*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. @@ -73,15 +73,15 @@ CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 ## 커뮤니티 설문 조사를 사용하는 이유 -데이터 결과는 주로 업계에서 자동화된 방식으로 테스트할 수 있는 범위에 한정된다. AppSec 전문가와 대화해 보면 아직 데이터에 반영되지 않은 발견 사항과 트렌드에 대해 들을 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되며, 이러한 테스트를 자동화하여 대규모 애플리케이션에 적용하는 데는 더 많은 시간이 필요하다. 현재 확인할 수 있는 모든 것은 과거를 돌아보는 것이며, 데이터에 반영되지 않은 최근 트렌드가 누락되어 있을 수 있다. +조사된 데이터는 주로 업계에서 자동화된 방식으로 테스트할 수 있는 범위에 한정되어 있다. 경험 많은 애플리케이션 보안 전문가들과 대화해 보면 아직 데이터에 반영되지 않은 취약점 유형과 트렌드에 대해 존재함을 알 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되며, 이러한 테스트를 자동화하여 대규모 애플리케이션에 적용하는 데는 더 많은 시간이 필요하다. 현재 확인할 수 있는 모든 것은 과거를 돌아보는 것이며, 그 과정에서 지난 해의 트렌드가 충분히 반영되지 않았을 가능성이 있다. 따라서 데이터가 불완전하기 때문에 10개 카테고리 중 8개만 데이터에서 선정한다. 나머지 2개 카테고리는 Top 10 커뮤니티 설문조사에서 도출되었다. 이를 통해 현장 실무자들이 데이터에 포함되지 않거나 데이터로 표현되기 어려운 주요 위험에 대해 직접 투표할 수 있도록 하였다. -## 데이터 제공자에게 감사를 전한다 +## 데이터 제공자들께 드리는 감사의 글 **** -다음 조직들은 익명 기부자 다수와 함께 280만 건 이상의 애플리케이션 데이터를 제공하여 역대 가장 방대하고 포괄적인 애플리케이션 보안 데이터셋 구축에 기여하였다. 이들의 도움 없이는 불가능한 작업이었다. +다음 조직들은 익명 기부자 다수와 함께 280만 건 이상의 애플리케이션 데이터를 제공하여 역대 가장 방대하고 포괄적인 애플리케이션 보안 데이터 세트 구축에 기여하였다. 이들의 도움 없이는 불가능한 작업이었다. * Accenture (Prague) * Anonymous (multiple) @@ -106,9 +106,9 @@ CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 ## 이슈 및 풀 리퀘스트 제출 -수정 사항이나 이슈는 언제든지 제출할 수 있다. +수정 사항이나 이슈는 아래의 링크에 언제든지 제출할 수 있다. -### 프로젝트 링크: +### 프로젝트 링크 * [홈페이지](https://owasp.org/www-project-top-ten/) * [GitHub 저장소](https://github.com/OWASP/Top10) From be3577a5851e0c054709e5654040758d9870dfce Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 28 Dec 2025 20:45:42 +0900 Subject: [PATCH 021/167] Refine wording for clarity --- 2025/docs/ko/0x01_2025-About_OWASP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index d46dd05c0..01c5b8cc3 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -18,7 +18,7 @@ OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있 OWASP의 모든 도구, 문서, 동영상, 프레젠테이션을 애플리케이션 보안 개선에 관심이 있는 누구나 자유롭게 이용하고 공유할 수 있도록 공개하고 있다. 각 지역 챕터의 생성 및 참여도 자유롭게 가능하다. -OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역에서 개선이 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. +OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역을 개선 하는 게 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. OWASP는 조금 다른 성격의 조직이다. 상업적 이해관계에서 벗어나 있기 때문에, 애플리케이션 보안에 관해 편향되지 않고 실질적이며 비용적으로 효율적인 정보를 제공하고 있다. From bc9bcfc843c4c9885c51fc2a0bfca20a178c0853 Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Sun, 28 Dec 2025 20:49:25 +0900 Subject: [PATCH 022/167] Delete 2025/docs/ko/.gitkeep --- 2025/docs/ko/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 2025/docs/ko/.gitkeep diff --git a/2025/docs/ko/.gitkeep b/2025/docs/ko/.gitkeep deleted file mode 100644 index e69de29bb..000000000 From 454c91d15853158407eca2b874db54f0bee19f81 Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Mon, 29 Dec 2025 11:00:44 +0900 Subject: [PATCH 023/167] Remove pronunciation word --- 2025/docs/ko/0x01_2025-About_OWASP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index 723e15a27..3e28245a4 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -1,6 +1,6 @@ # OWASP 소개 -오픈 월드와이드 애플리케이션 보안 프로젝트(Open Worldwide Application Security Project, OWASP, 오와스프)는 각 조직이 신뢰할 수 있는 애플리케이션과 API를 개발, 도입, 유지할 수 있도록 지원하는 오픈 커뮤니티이다. +오픈 월드와이드 애플리케이션 보안 프로젝트(Open Worldwide Application Security Project, OWASP)는 각 조직이 신뢰할 수 있는 애플리케이션과 API를 개발, 도입, 유지할 수 있도록 지원하는 오픈 커뮤니티이다. OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있다. From 7ecbe31a674ce9faca2beb1638c623c8f3432058 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Mon, 29 Dec 2025 11:23:34 +0900 Subject: [PATCH 024/167] Reflect review --- 2025/docs/kr/0x00_2025-Introduction.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index d677956f6..dd584d9ab 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -6,8 +6,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! -설문 조사를 통해 데이터와 관점을 제공해 준 모든 분께 깊은 감사를 드립니다. 여러분 없이는 이번 버전이 나올 수 없었습니다. **감사합니다!** - +데이터와 설문 조사를 통해 견해를 나눠주신 모든 분께 깊은 감사를 드립니다. 여러분 없이는 이번 버전이 없었을 겁니다. **감사합니다!** ## OWASP Top 10:2025 소개 @@ -27,7 +26,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ## 2025년 Top 10의 변화 -2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능하다. +2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. ![Mapping](../assets/2025-mappings.png) # OWASP Top 10 2025 @@ -37,25 +36,25 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! * **[A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md)**기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. * **[A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. * **[A05:2025 - Injection](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동은 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. -* **[A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md)**은 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 계단 하락하였다. 이 카테고리는 2021년에 신설되었으며, 이후 업계에서 Threat Modeling 도입과 Secure Design에 대한 강조가 눈에 띄게 진전되었다. -* **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[식별 및 인증 실패](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다 +* **[A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md)**은 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 눈에 띄는 개선이 확인되었다. +* **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/A07_-Identificatio_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다 * **[A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 Software Supply Chain Failures보다 상대적으로 더 로우 레벨(Lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary) 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. -* **[A09:2025 - Security Logging & Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [Security Logging and Monitoring Failures](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)). 로그에서 발생한 이벤트에 대해 적절한 대응을 위한 알림(Alert) 기능의 중요성을 강조하기 위한 것이다. 알림 체계가 결여된 로깅은 보안 사고를 식별하는 데 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. +* **[A09:2025 - Security Logging & Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 로그에서 발생한 이벤트에 대해 적절한 대응을 위한 알림(Alert) 기능의 중요성을 강조하기 위한 것이다. 알림 체계가 결여된 로깅은 보안 사고를 식별하는 데 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. **[A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(Fail Open) 등 비정상적인 상태에서 비롯되는 24개 CWE를 포함하고 있다. ## 방법론 -이번 Top Ten은 데이터에 기반하되, 데이터에 맹목적으로 의존하지는 않는다. 수집된 데이터를 기반으로 12개 카테고리의 순위를 산정하였으며, 커뮤니티 설문조사 결과를 통해 2개 카테고리를 추가로 선정하거나 강조될 수 있도록 했다. 이러한 접근 방식을 채택한 근본적인 이유는, 수집된 데이터를 분석하는 것은 본질적으로 과거를 돌아보는 작업이기 때문이다. 애플리케이션 보안 연구자들은 새로운 취약점을 발굴하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자하고 있다. 이러한 테스트를 도구와 프로세스에 통합하기까지는 몇 주에서 몇 년이 소요된다. 특정 취약점을 대규모로 신뢰성 있게 테스트할 수 있게 될 때쯤이면 이미 몇 년이 경과한 경우가 많다. 또한 신뢰성 있게 테스트하기가 어려워 데이터에 반영되지 않는 중요한 위험 항목도 존재한다. 이러한 관점을 보완하기 위해, 우리는 현장에서 활동하는 애플리케이션 보안 및 개발 실무자들에게 커뮤니티 설문을 통해 테스트 데이터에서 충분히 반영되지 못하고 있는 핵심 위험 요소가 무엇이라고 생각하는지 확인한다. +이번 Top 10은 데이터에 기반하되, 데이터에 맹목적으로 의존하지는 않는다. 수집된 데이터를 기반으로 12개 카테고리의 순위를 산정하였으며, 커뮤니티 설문조사 결과를 통해 2개 카테고리를 추가로 선정했다. 이러한 접근 방식을 채택한 근본적인 이유는, 수집된 데이터를 분석하는 것은 본질적으로 과거를 돌아보는 작업이기 때문이다. 애플리케이션 보안 연구자들은 새로운 취약점을 발굴하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자하고 있다. 이러한 테스트를 도구와 프로세스에 통합하기까지는 몇 주에서 몇 년이 소요된다. 특정 취약점을 대규모로 신뢰성 있게 테스트할 수 있게 될 때쯤이면 이미 몇 년이 경과한 경우가 많다. 또한 신뢰성 있게 테스트하기가 어려워 데이터에 반영되지 않는 중요한 위험 항목도 존재한다. 이러한 한계를 보완하기 위해, 현장의 애플리케이션 보안 및 개발 실무자들을 대상으로 커뮤니티 설문을 진행하여, 테스트 데이터에서 충분히 드러나지 않지만 실제로 직면하고 있는 핵심 위험 요소를 파악한다. ## 카테고리 구성 방식 이번 OWASP Top 10에서는 이전 버전과 비교하여 일부 카테고리가 변경되었다. 아래는 주요 변경 사항에 대한 요약이다. -이번 조사에서는 2021년 버전과 달리 CWE에 대한 제한 없이 데이터를 수집하였다. 특정 연도(2021년부터)에 테스트된 애플리케이션 수와 테스트에서 CWE가 하나 이상 발견된 애플리케이션 수를 요청하였다. 이 방식을 통해 각 CWE가 전체 애플리케이션 중 얼마나 널리 분포하는지 파악할 수 있다. 발생 빈도는 의도적으로 고려하지 않았는데, 이는 다른 상황에서는 유용할 수 있으나 전체 애플리케이션에서의 실제 발생률을 왜곡할 수 있기 때문이다. 애플리케이션에서 특정 CWE가 4건 발견되었든 4,000건 발견되었든 Top Ten 산정에는 영향을 미치지 않는다. 이는 Manual Tester가 동일한 취약점을 애플리케이션 내에서 여러 번 발견하더라도 한 번만 기록하는 경향이 있는 반면, 자동화된 테스트 프레임워크는 모든 인스턴스를 개별적으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개에서 2021년 약 400개로, 이번 버전에서는 589개로 증가하였다. 향후 추가적인 데이터 분석을 보완 자료로 제공할 계획이다. CWE 수의 대폭 증가로 인해 카테고리 구조의 변경이 불가피하였다. +이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트 된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE의 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 이번 버전에서도 CWE의 발생 빈도를 분석에서 제외한다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 퍼져있는 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경이 불가피하였다. -CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. Root Cause 유형에는 "Cryptographic Failure", "Misconfiguration" 등이 있고, Symptom 유형에는 "Sensitive Data Exposure", "Denial of Service" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 Root Cause에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. Symptom보다 Root Cause에 집중하는 것은 새로운 개념이 아니며, 기존 Top Ten도 Symptom과 Root Cause가 혼재되어 있었다. CWE 자체도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-Software Supply Chain Failures, A09:2025-Security Logging and Alerting Failures)에서 최대 40개(A01:2025-Broken Access Control)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. +CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. Root Cause 유형에는 "Cryptographic Failure", "Misconfiguration" 등이 있고, Symptom 유형에는 "Sensitive Data Exposure", "Denial of Service" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 Root Cause에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. Symptom보다 Root Cause에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 Symptom과 Root Cause가 혼재되어 있었다. CWE 자체도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-Software Supply Chain Failures, A09:2025-Security Logging and Alerting Failures)에서 최대 40개(A01:2025-Broken Access Control)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. -MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이로 인해 Top Ten의 일부가 적용되지 않는 경우 도구 및 교육/인식 프로그램에 문제가 발생한다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 Injection, Command Injection, Cross-site Scripting, Hardcoded Passwords, Lack of Validation, Buffer Overflows, Cleartext Storage of Sensitive Information 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top Ten 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. +MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이로 인해 Top 10의 일부가 적용되지 않는 경우 도구 및 교육/인식 프로그램에 문제가 발생한다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 Injection, Command Injection, Cross-site Scripting, Hardcoded Passwords, Lack of Validation, Buffer Overflows, Cleartext Storage of Sensitive Information 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. ## 카테고리 선정을 위한 데이터 사용법 @@ -66,9 +65,9 @@ CVSSv2에서는 Exploit과 (Technical) Impact 모두 최대 10.0까지 가능하 OWASP Dependency Check에서 추출한 National Vulnerability Database(NVD) 데이터에는 CWE에 매핑된 CVE 기록이 약 175,000건(2021년 125,000건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년 241개에서 증가)이다. 추출된 약 220,000건의 CVE 중 160,000건은 CVSS v2 점수를, 156,000건은 CVSS v3 점수를, 6,000건은 CVSS v4 점수를 보유하고 있다. 다수의 CVE가 복수의 점수를 보유하고 있어 합계가 220,000건을 초과한다. -Top Ten 2025에서는 다음과 같은 방식으로 평균 Exploit 및 Impact 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 보유한 비율과 CVSSv2 점수를 보유한 나머지 비율에 따라 Exploit 및 Impact 점수에 가중치를 부여하여 전체 평균을 산출하였다. 이 평균값을 데이터셋의 CWE에 매핑하여 위험 산정 공식의 나머지 절반인 Exploit 및 (Technical) Impact 점수로 활용하였다. +Top 10 2025에서는 다음과 같은 방식으로 평균 Exploit 및 Impact 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 보유한 비율과 CVSSv2 점수를 보유한 나머지 비율에 따라 Exploit 및 Impact 점수에 가중치를 부여하여 전체 평균을 산출하였다. 이 평균값을 데이터셋의 CWE에 매핑하여 위험 산정 공식의 나머지 절반인 Exploit 및 (Technical) Impact 점수로 활용하였다. -CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 산정 알고리즘이 근본적으로 변경되어 CVSS v2 및 v3처럼 *Exploit* 또는 *Impact* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top Ten 버전에서는 CVSS v4.0 점수 활용 방안을 모색할 계획이나, 2025년 버전에서는 적절한 시점에 적용할 수 있는 방법을 찾지 못하였다. +CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 산정 알고리즘이 근본적으로 변경되어 CVSS v2 및 v3처럼 *Exploit* 또는 *Impact* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수 활용 방안을 모색할 계획이나, 2025년 버전에서는 적절한 시점에 적용할 수 있는 방법을 찾지 못하였다. ## 커뮤니티 설문 조사를 사용하는 이유 From f7d28123ac6c450bd24d5592955a16505c1f7e35 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Mon, 29 Dec 2025 11:39:21 +0900 Subject: [PATCH 025/167] Title and some words changed --- .../docs/ko/A01_2025-Broken_Access_Control.md | 216 +++++++++++++++++ ...1\352\267\274 \355\206\265\354\240\234.md" | 218 ------------------ 2 files changed, 216 insertions(+), 218 deletions(-) create mode 100644 2025/docs/ko/A01_2025-Broken_Access_Control.md delete mode 100644 "2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md new file mode 100644 index 000000000..43e4d52a9 --- /dev/null +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -0,0 +1,216 @@ +# A01:2025 불충분한 접근 제어![icon](../assets/TOP_10_Icons_Final_Broken_Access_Control.png){: style="height:80px;width:80px" align="right"} + + + +## 배경. + +불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 어떠한 형태로든 불충분한 접근 제어 취약점이 발견되었으며, 관심이 갈만한 보안약점(CWE)은 CWE-200: 비인기자에게 민감정보 노출, CWE-201: 전송된 데이터로부터 민감정보 노출, CWE-918: 서버측 요청 위조(SSRF), 그리고 CWE-352: 크로스 사이트 요청 위조(CSRF) 가 있다. 해당 카테고리는 제공받은 데이터 기준 발성 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. + +## 점수표. + + + + + + + + + + + + + + + + + + + + + + + + + +
매칭된 보안약점(CWE) + 최대 취약점 발생률 + 평균 취약점 발생률 + 최대 테스트 커버리지 + 평균 테스트 커버리지 + 평균 가중 공격 가능성 + 평균 가중 영향도 + 총 발생 건수 + 총 CVE 건수 +
40 + 20.15% + 3.74% + 100.00% + 42.93% + 7.04 + 3.84 + 1,839,701 + 32,654 +
+ + + +## 설명. + +접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 불충분한 접근제어는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제(파괴), 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔한 불충분한 접근 제어 취약점은 리스트는 다음과 같다: + +* 최소 권한 원칙 위반, 흔히 알려진 기본적 우선 거부(Deny by Default)는 오직 허가된 기능, 역할, 사용자들에게만 허용된 자원 접근이 가능해야 한다. 그러나 모두에게 허가되거나 권한이 필요없는 자에게도 권한이 부여된 경우 +* 수정된 URL, 내부 애플리케이션 상태, HTML 페이지 또는 공격 도구를 이용한 수정된 API 요청을 이용한 접근제어 로직 우회가 가능한 경우(파라미터 위조 또는 브라우징 강제) +* 다른 사용자 계정을 조회 또는 수정할 수 있는 고유 식별자 제공하는 경우(안전하지 않은 직접 객체 참조, Insecure Direct Object References) +* POST, PUT 그리고 DELETE에 대한 접근 가능한 API에 접근 제어 로직이 없는 경우 +* 권한 상승. 로그인 과정 없이 다른 유저로 가장하거나 또는 사용자가 보유한 이상의 권한을 획득하는 것(예시. 관리자 접근 권한) +* 메타데이터 위조, JSON 웹 토큰(JWT), 접근 통제 토큰, 쿠키 또는 히든 필드 값을 수정하여 재전송 또는 위조함으로써 권한 상승을 하는 경우 또는 JWT 무효화 남용하는 경우 +* 교차 출처 자원 공유 (CORS, Cross-Origin Resource Sharing)의 잘못된 설정으로 비인가자 또는 비신뢰 출처로부터 API 접근을 허용하는 경우 +* 브라우징 강제 (URL 예측)는 인증이 필요한 페이지에 인증없이 접근하거나, 권한이 필요한 페이지에 일반 유저가 접근할 경우 + + +## 방어(Prevent). + +접근 제어는 공격자가 접근 제어 로직 또는 메타데이터를 수정할 수 없는 곳에서 신뢰할 수 있는 서버측 코드나 서버리스 API들로 구현될 때 효과적이다. + + + +* 공개 리소스 제외 모든 리소스는 거부 우선 정책(Deny By Default)을 따라야 한다. +* 접근통제 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 자원 검증 사용 최소화해야 한다. +* 모델 접근 제어는 소유권에 의해 행해져야 하며, 다른 사용자에 의해 레코드 생성, 읽기, 갱신, 삭제가 이루어져선 안 된다. +* 애플리케이션의 고유한 비즈니스 제한 요구사항은 도메인 모델에 의해 강제되어야 한다. +* 웹 서버 디렉토리 리스팅 비활성화 여부, 파일 메타데이터 검증(예시. .git 디렉토리), 그리고 백업 파일이 웹 루트에 존재하는지 확인해야 한다. +* 불충분한 접근 제어 로그 기록 및 적절한 경우엔 관리자에게 경고 알림 (예시. 반복적 실패 또는 비정상적 접근 시도) +* API 및 컨트롤러 속도 제한 구현 하여 자동화된 공격 툴 피해 최소화해야 한다. +* 상태기반 세션 식별자는 로그아웃 후 무효화되어야 한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격자를 위한 공격 표면 및 기회를 최소화해야 하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려해야 하며, OAuth 표준에 따른 토큰 취소도 고려하여야 한다. +* 간단하고 선언적 접근 제어를 제공하는 확립된 툴킷과 패턴을 사용해야 한다. +* 개발자와 QA 스태프는 보유 중인 시스템과 통합적 테스트에서 함수적 접근 제어을 포함하여야 한다. +## 예시 공격 시나리오. + +**시나리오 1:** 어떤 애플리케이션은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다: + + +``` +pstmt.setString(1, request.getParameter("acct")); +ResultSet results = pstmt.executeQuery( ); +``` + + +공격자는 원하는 계정 정보를 전달하기 위해 간단하게 'acct' 파라미터를 변조할 수 있으며, 만약 해당 파라미터가 완벽하게 검증되지 않았을 시 공격자는 모든 사용자 계정 정보에 접근 가능하다. + + +``` +https://example.com/app/accountInfo?acct=notmyacct +``` + + +**시나리오 2:** 공격자는 간단하게 목적 URL로 브라우징을 강제할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. + + +``` +https://example.com/app/getappInfo +https://example.com/app/admin_getappInfo +``` + + +먄약 인증되지 않은 유저가 해당 페이지(/app/getappInfo) 접근이 가능하다면, 이건 보안 취약점으로 간주되고, 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이것도 보안 취약점으로 간주된다.(/app/admin_getappInfo) + +**시나리오 3:** 애플리케이션이 프론트 엔드에서만 접근 제어를 하는 경우. 공격자가 브라우저에서 동작하는 자바 스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없다면, 커멘드 라인에서 간단하게 curl 명령어를 실행하면 된다: + +``` +$ curl https://example.com/app/admin_getappInfo +``` + + + + +## 참조. + +* [OWASP Proactive Controls: C1: Implement Access Control](https://top10proactive.owasp.org/archive/2024/the-top-10/c1-accesscontrol/) +* [OWASP Application Security Verification Standard: V8 Authorization](https://github.com/OWASP/ASVS/blob/master/5.0/en/0x17-V8-Authorization.md) +* [OWASP Testing Guide: Authorization Testing](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/README) +* [OWASP Cheat Sheet: Authorization](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html) +* [PortSwigger: Exploiting CORS misconfiguration](https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties) +* [OAuth: Revoking Access](https://www.oauth.com/oauth2-servers/listing-authorizations/revoking-access/) + + +## 매칭된 보안약점(CWE) 목록. + +* [CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')](https://cwe.mitre.org/data/definitions/22.html) + +* [CWE-23 Relative Path Traversal](https://cwe.mitre.org/data/definitions/23.html) + +* [CWE-36 Absolute Path Traversal](https://cwe.mitre.org/data/definitions/36.html) + +* [CWE-59 Improper Link Resolution Before File Access ('Link Following')](https://cwe.mitre.org/data/definitions/59.html) + +* [CWE-61 UNIX Symbolic Link (Symlink) Following](https://cwe.mitre.org/data/definitions/61.html) + +* [CWE-65 Windows Hard Link](https://cwe.mitre.org/data/definitions/65.html) + +* [CWE-200 Exposure of Sensitive Information to an Unauthorized Actor](https://cwe.mitre.org/data/definitions/200.html) + +* [CWE-201 Exposure of Sensitive Information Through Sent Data](https://cwe.mitre.org/data/definitions/201.html) + +* [CWE-219 Storage of File with Sensitive Data Under Web Root](https://cwe.mitre.org/data/definitions/219.html) + +* [CWE-276 Incorrect Default Permissions](https://cwe.mitre.org/data/definitions/276.html) + +* [CWE-281 Improper Preservation of Permissions](https://cwe.mitre.org/data/definitions/281.html) + +* [CWE-282 Improper Ownership Management](https://cwe.mitre.org/data/definitions/282.html) + +* [CWE-283 Unverified Ownership](https://cwe.mitre.org/data/definitions/283.html) + +* [CWE-284 Improper Access Control](https://cwe.mitre.org/data/definitions/284.html) + +* [CWE-285 Improper Authorization](https://cwe.mitre.org/data/definitions/285.html) + +* [CWE-352 Cross-Site Request Forgery (CSRF)](https://cwe.mitre.org/data/definitions/352.html) + +* [CWE-359 Exposure of Private Personal Information to an Unauthorized Actor](https://cwe.mitre.org/data/definitions/359.html) + +* [CWE-377 Insecure Temporary File](https://cwe.mitre.org/data/definitions/377.html) + +* [CWE-379 Creation of Temporary File in Directory with Insecure Permissions](https://cwe.mitre.org/data/definitions/379.html) + +* [CWE-402 Transmission of Private Resources into a New Sphere ('Resource Leak')](https://cwe.mitre.org/data/definitions/402.html) + +* [CWE-424 Improper Protection of Alternate Path](https://cwe.mitre.org/data/definitions/424.html) + +* [CWE-425 Direct Request ('Forced Browsing')](https://cwe.mitre.org/data/definitions/425.html) + +* [CWE-441 Unintended Proxy or Intermediary ('Confused Deputy')](https://cwe.mitre.org/data/definitions/441.html) + +* [CWE-497 Exposure of Sensitive System Information to an Unauthorized Control Sphere](https://cwe.mitre.org/data/definitions/497.html) + +* [CWE-538 Insertion of Sensitive Information into Externally-Accessible File or Directory](https://cwe.mitre.org/data/definitions/538.html) + +* [CWE-540 Inclusion of Sensitive Information in Source Code](https://cwe.mitre.org/data/definitions/540.html) + +* [CWE-548 Exposure of Information Through Directory Listing](https://cwe.mitre.org/data/definitions/548.html) + +* [CWE-552 Files or Directories Accessible to External Parties](https://cwe.mitre.org/data/definitions/552.html) + +* [CWE-566 Authorization Bypass Through User-Controlled SQL Primary Key](https://cwe.mitre.org/data/definitions/566.html) + +* [CWE-601 URL Redirection to Untrusted Site ('Open Redirect')](https://cwe.mitre.org/data/definitions/601.html) + +* [CWE-615 Inclusion of Sensitive Information in Source Code Comments](https://cwe.mitre.org/data/definitions/615.html) + +* [CWE-639 Authorization Bypass Through User-Controlled Key](https://cwe.mitre.org/data/definitions/639.html) + +* [CWE-668 Exposure of Resource to Wrong Sphere](https://cwe.mitre.org/data/definitions/668.html) + +* [CWE-732 Incorrect Permission Assignment for Critical Resource](https://cwe.mitre.org/data/definitions/732.html) + +* [CWE-749 Exposed Dangerous Method or Function](https://cwe.mitre.org/data/definitions/749.html) + +* [CWE-862 Missing Authorization](https://cwe.mitre.org/data/definitions/862.html) + +* [CWE-863 Incorrect Authorization](https://cwe.mitre.org/data/definitions/863.html) + +* [CWE-918 Server-Side Request Forgery (SSRF)](https://cwe.mitre.org/data/definitions/918.html) + +* [CWE-922 Insecure Storage of Sensitive Information](https://cwe.mitre.org/data/definitions/922.html) + +* [CWE-1275 Sensitive Cookie with Improper SameSite Attribute](https://cwe.mitre.org/data/definitions/1275.html) diff --git "a/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" "b/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" deleted file mode 100644 index 0619b21f7..000000000 --- "a/2025/docs/ko/A01_2025-\354\213\244\355\214\250\355\225\234 \354\240\221\352\267\274 \355\206\265\354\240\234.md" +++ /dev/null @@ -1,218 +0,0 @@ -# A01:2025 실패한 접근 통제 ![icon](../assets/TOP_10_Icons_Final_Broken_Access_Control.png){: style="height:80px;width:80px" align="right"} - - - -## 배경(Background). - -실패한 접근통제는 OWASP TOP 10에서 1위를 유지있다. 100%의 테스트된 애플리케이션에서 실패한 접근 통제 취약점이 발견되었으며, 관심이 갈만한 보안약점(CWE)은 CWE-200: 비인기자에게 민감정보 노출, CWE-201: 전송된 데이터로부터 민감정보 노출, CWE-918: 서버측 요청 위조(SSRF), 그리고 CWE-352: 크로스 사이트 요청 위조(CSRF) 가 있다. 이번 카테고리는 제공받은 데이터로부터 높은 발생률을 보이며, 두번째로 높은 관련된 CVE 개수를 보유하고 있다. - -## 점수표(Score Table). - - - - - - - - - - - - - - - - - - - - - - - - - -
매칭된 CWEs - 최대 사고 발생률 - 평균 사고 발생률 - 최대 커버리지(범위) - 평균 커버리지(범위) - 평균 공격 심각도 - 평균 영향도 - 총 발생률 - 총 CVE 개수 -
40 - 20.15% - 3.74% - 100.00% - 42.93% - 7.04 - 3.84 - 1,839,701 - 32,654 -
- - - -## 설명(Description). - -접근통제는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 실패된 접근통제는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제(파괴), 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔한 접근 통제 취약점은 리스트는 다음과 같다: - -- 최소 권한 원칙 위반, 흔히 알려진 기본적 우선 거부(Deny by Default)는 오직 허가된 기능, 역할, 사용자들에게만 허용된 자원 접근이 가능하다. 그러나 모두에게 허가되거나 권한이 필요없는 자에게도 권한이 부여된 경우 취약하다 판단한다. -- 수정된 URL, 내부 애플리케이션 상태, HTML 페이지 또는 공격 도구를 이용한 수정된 API 요청을 이용한 접근통제 우회가 가능한 경우(파라미터 위조 또는 브라우징 강제) -* 다른 사용자 계정을 조회 또는 수정할 수 있는 고유 식별자 제공하는 경우(안전하지 않은 직접 객체 참조, Insecure Direct Object References) -* POST, PUT 그리고 DELETE에 대한 접근 가능한 API에 접근 통제 로직이 없는 경우 -* 권한 상승. 로그인 과정 없이 다른 유저로 가장하거나 또는 사용자가 보유한 이상의 권한을 획득가능한 경우(예시. 관리자 접근 권한) -* 메타데이터 위조, JSON 웹 토큰(JWT), 접근 통제 토큰, 쿠키 또는 히든 필드 값을 수정하여 재전송 또는 위조함으로써 권한 상승을 하는 경우 또는 JWT 무효화 남용하는 경우 -* 교차 출처 자원 공유 (CORS, Cross-Origin Resource Sharing)의 잘못된 설정으로 비인가자 또는 비신뢰 출처로부터 API 접근을 허용하는 경우 -* 브라우징 강제 (URL 예측)로 인증이 필요한 페이지에 인증없이 접근하거나, 권한이 필요한 페이지에 일반 유저가 접근하는 경우 - - -## 방어(Prevent). - -접근통제는 공격자가 접근 통제 로직 또는 메타데이터를 수정할 수 없는 곳에서 신뢰할 수 있는 서버측 코드나 서버리스 API들로 구현될 때 효과적이다. - - - -* 공개 리소스 제외 모든 리소스는 거부 우선 정책(Deny By Default)을 따라야 한다. -* 접근통제 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 자원 검증 사용 최소화해야 한다. -* 모델 접근 통제는 소유권에 의해 행해져야 하며, 다른 사용자에 의해 레코드 생성, 읽기, 갱신, 삭제가 이루어져선 안 된다. -* 애플리케이션의 고유한 비즈니스 요구사항 제한은 도메인 모델에 의해 강제되어야 한다. -* 웹 서버 디렉토리 리스팅 비활성화 여부, 파일 메타데이터 검증(예시. .git 디렉토리), 그리고 백업 파일이 웹 루트에 존재하는지 확인해야 한다. -* 접근 통제 실패 로그 기록 및 적절한 경우엔 관리자에게 경고 알림하여야 한다. (예시. 반복적 실패 또는 비정상적 접근 시도) -* API 및 컨트롤러 속도 제한 구현 하여 자동화된 공격 툴 피해 최소화해야 한다. -* 상태기반 세션 식별자는 로그아웃 후 무효화되어야 한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격자를 위한 공격 표면 및 기회를 최소화해야 하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려해야 하며, OAuth 표준에 따른 토큰 취소도 고려하여야 한다. -* 간단하고 선언적 접근 통제를 제공하는 확립된 툴킷과 패턴을 사용해야 한다. - -개발자와 QA 스태프는 보유 중인 시스템과 통합적 테스트에서 함수적 접근 통제을 포함하여야 한다. - -## 예시 공격 시나리오. - -**시나리오 1:** 어떤 애플리케이션은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다: - - -``` -pstmt.setString(1, request.getParameter("acct")); -ResultSet results = pstmt.executeQuery( ); -``` - - -공격자는 원하는 계정 정보를 전달하기 위해 간단하게 'acct' 파라미터를 변조할 수 있으며, 만약 해당 파라미터가 완벽하게 검증되지 않았을 시 공격자는 모든 사용자 계정 정보에 접근 가능하다. - - -``` -https://example.com/app/accountInfo?acct=notmyacct -``` - - -**시나리오 2:** 공격자는 간단하게 목적 URL로 브라우징을 강제할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. - - -``` -https://example.com/app/getappInfo -https://example.com/app/admin_getappInfo -``` - - -먄약 인증되지 않은 유저가 해당 페이지(/app/getappInfo) 접근이 가능하다면, 이건 보안 취약점으로 간주되고, 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이것도 보안 취약점으로 간주된다.(/app/admin_getappInfo) - -**시나리오 3:** 애플리케이션이 프론트 엔드에서만 접근 제어를 하는 경우. 공격자는 브라우저에서 동작하는 자바 스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없다. 이때 커멘드 라인에서 간단하게 curl 명령어를 실행하면 된다: - -``` -$ curl https://example.com/app/admin_getappInfo -``` - - - - -## 참조. - -* [OWASP 사전 활성화 통제: C1: 접근 통제 구현](https://top10proactive.owasp.org/archive/2024/the-top-10/c1-accesscontrol/) -* [OWASP 애플리케이션 보안 검증 표준: V8 인가](https://github.com/OWASP/ASVS/blob/master/5.0/en/0x17-V8-Authorization.md) -* [OWASP 테스트 가이드: 인증 테스트](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/README) -* [OWASP 치트시트: 인증](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html) -* [PortSwigger: CORS 잘못된 설정 공격](https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties) -* [OAuth: 접근 취소](https://www.oauth.com/oauth2-servers/listing-authorizations/revoking-access/) - - -## 매핑된 보안약점 (CWEs) 리스트 - -* [CWE-22 제한된 디렉토리의 적절하지 않은 경로 이름('경로 조작')](https://cwe.mitre.org/data/definitions/22.html) - -* [CWE-23 상대적 경로 조작](https://cwe.mitre.org/data/definitions/23.html) - -* [CWE-36 절대적 경로 조작](https://cwe.mitre.org/data/definitions/36.html) - -* [CWE-59 파일 접근 전 적절하지 않은 링크 해석 ('링크 따라가기(following)')](https://cwe.mitre.org/data/definitions/59.html) - -* [CWE-61 유닉스 심볼릭 링크 따라가기(following)](https://cwe.mitre.org/data/definitions/61.html) - -* [CWE-65 윈도우즈 하드 링크](https://cwe.mitre.org/data/definitions/65.html) - -* [CWE-200 비인가자에게 민감 데이터 노출](https://cwe.mitre.org/data/definitions/200.html) - -* [CWE-201 전달된 데이터로부터 민감 데이터 노출](https://cwe.mitre.org/data/definitions/201.html) - -* [CWE-219 웹 루트 내 민감 데이터 저장](https://cwe.mitre.org/data/definitions/219.html) - -* [CWE-276 부적절한 기본 권한 설정](https://cwe.mitre.org/data/definitions/276.html) - -* [CWE-281 부적절한 권한 상태 유지](https://cwe.mitre.org/data/definitions/281.html) - -* [CWE-282 부적절한 소유권 관리](https://cwe.mitre.org/data/definitions/282.html) - -* [CWE-283 검증되지 않은 소유권](https://cwe.mitre.org/data/definitions/283.html) - -* [CWE-284 부적절한 접근 통제](https://cwe.mitre.org/data/definitions/284.html) - -* [CWE-285 부적절한 인가](https://cwe.mitre.org/data/definitions/285.html) - -* [CWE-352 크로스 사이트 요청 위조 (CSRF)](https://cwe.mitre.org/data/definitions/352.html) - -* [CWE-359 비인가자에게 개인정보 유출](https://cwe.mitre.org/data/definitions/359.html) - -* [CWE-377 안전하지 않은 임시 파일](https://cwe.mitre.org/data/definitions/377.html) - -* [CWE-379 안전하지 않은 권한이 부여된 디렉토리에 임시 파일 생성](https://cwe.mitre.org/data/definitions/379.html) - -* [CWE-402 새로운 영역 내 내부 자원 전달('자원 유출')](https://cwe.mitre.org/data/definitions/402.html) - -* [CWE-424 대체 경로에 대한 부적절한 보호](https://cwe.mitre.org/data/definitions/424.html) - -* [CWE-425 직접 요청 ('브라우징 강제')](https://cwe.mitre.org/data/definitions/425.html) - -* [CWE-441 의도되지 않은 프록시 또는 중간자](https://cwe.mitre.org/data/definitions/441.html) - -* [CWE-497 비인가자 통제 영역에 민감 시스템 정보 노출](https://cwe.mitre.org/data/definitions/497.html) - -* [CWE-538 외부 접근 가능한 파일 또는 디렉토리에 민감 데이터 삽입](https://cwe.mitre.org/data/definitions/538.html) - -* [CWE-540 소스코드 내 포함된 민감 데이터](https://cwe.mitre.org/data/definitions/540.html) - -* [CWE-548 디렉토리 리스팅을 통한 민감 데이터 노출](https://cwe.mitre.org/data/definitions/548.html) - -* [CWE-552 외부로부터 접근 가능한 파일 또는 디렉토리](https://cwe.mitre.org/data/definitions/552.html) - -* [CWE-566 사용자 통제 가능한 SQL 기본키를 통한 인가 우회](https://cwe.mitre.org/data/definitions/566.html) - -* [CWE-601 신뢰할 수 없는 사이트로의 URL 리다이렉션 ('오픈 리다이렉션')](https://cwe.mitre.org/data/definitions/601.html) - -* [CWE-615 소스코드 주석 내 민감 데이터 포함](https://cwe.mitre.org/data/definitions/615.html) - -* [CWE-639 사용자 통제 가능한 키를 통한 인가 우회](https://cwe.mitre.org/data/definitions/639.html) - -* [CWE-668 잘못된 영역으로 자원 유출](https://cwe.mitre.org/data/definitions/668.html) - -* [CWE-732 중요 리소스에 부적절한 권한 할당](https://cwe.mitre.org/data/definitions/732.html) - -* [CWE-749 위험한 메소드 및 함수 노출](https://cwe.mitre.org/data/definitions/749.html) - -* [CWE-862 인가 누락](https://cwe.mitre.org/data/definitions/862.html) - -* [CWE-863 부적절한 인가](https://cwe.mitre.org/data/definitions/863.html) - -* [CWE-918 서버측 요청 위조 (SSRF)](https://cwe.mitre.org/data/definitions/918.html) - -* [CWE-922 안전하지 않은 저장소 내 민감 데이터](https://cwe.mitre.org/data/definitions/922.html) - -* [CWE-1275 부적절한 SameSite 속성이 부여된 민감 쿠키](https://cwe.mitre.org/data/definitions/1275.html) From 0a76ab49a361b46a7e46940eb32e2f709e3aa4c9 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Mon, 29 Dec 2025 14:03:05 +0900 Subject: [PATCH 026/167] Translated A02_2025-Security_Misconfiguration file in korean Version 1.0 --- .../ko/A02_2025-Security_Misconfiguration.md | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 2025/docs/ko/A02_2025-Security_Misconfiguration.md diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md new file mode 100644 index 000000000..fa60cefe9 --- /dev/null +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -0,0 +1,145 @@ +# A02:2025 잘못된 보안 설정 ![icon](../assets/TOP_10_Icons_Final_Security_Misconfiguration.png){: style="height:80px;width:80px" align="right"} + + +## 배경. + +지난 버전에서 부터 5위로 올라왔으며, 테스트한 모든 애플리케이션에서 어떤 형태의 잘못된 보안 설정이 발견되었다. 이번 카테고리 내에서의 평균 사고 발생률은 3% 이며, 71만 9천(719k)개가 넘는 보안 약점(CWE)이 발견되었다. 설정 가능한 소프트웨어 쪽으로 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 일이 아니다. 관심이 갈만한 CWE는 `CWE-16: 설정` 그리고 `CWE-611: 부적절한 XML 외부 엔티티 참조 제한(XXE)`가 있다. + + +## 점수표. + + + + + + + + + + + + + + + + + + + + + + + + + +
매칭된 보안약점(CWE) + 최대 취약점 발생률 + 평균 취약점 발생률 + 최대 테스트 커버리지 + 평균 테스트 커버리지 + 평균 가중 공격 가능성 + 평균 가중 영향도 + 총 발생 건수 + 총 CVE 건수 +
40 + 20.15% + 3.74% + 100.00% + 42.93% + 7.04 + 3.84 + 1,839,701 + 32,654 +
+ + + +## 설명. + +잘못된 보안 설정은 보안 관점 그리고 취약점 관점에서 시스템, 애플리케이션, 클라우드 서비스 설정을 적절하지 않게 할 때 발생한다. + +다음과 같은 경우 애플리케이션은 취약할 수 있다 + + +* 애플리케이션 스택 어느 부분에서 적절한 보안성이 강구되지 않거나 또는 클라우드 서비스에 적절하지 않은 권한이 설정된 경우. +* 불필요한 기능이 활성화 또는 설치된 경우. (예시. 불필요 포트, 서비스, 페이지, 계정, 테스트 프레임워크 또는 권한) +* 기본 계정, 패스워드가 여전히 활성화되어 있거나 변경되지 않은 경우 +* 과도한 에러메시지를 처리할 약한 중앙 설정으로 에러 처리 과정을 통해 스택 추적(Stack trace)이나 과도한 에러 정보 메시지가 유저에게 전달되는 경우. +* 업그레이드된 시스템에서 최신 보안 기능이 비활성화 되어 있거나 안전하기 설정되지 않은 경우. +* 이전 버전과의 호환성을 위해 안전하지 않은 설정을 하는 경우. +* 애플리케이션 서버 내 보안 설정, 애플리케이션 프레임워크(예시. 스트럿츠(Struts), 스프링(Spring), ASP.NET), 라이브러리, 데이터베이스 등에서 보안 값이 설정되지 않은 경우. +* 서버가 보안 헤더 또는 지시자를 전달하지 않거나 보안 값이 설정되지 않은 경우. + +일관되고 반복 가능한 애플리케이션 보안설정 강화 절차가 없다면 시스템은 위험한 상태다. + + +## 방어. + +보안성이 강구된 설치 프로세스는 다음 항목들을 포함하여 구현되어야 한다 + + +* 반복 가능한 보안 강화 프로세스를 통해 다른 환경에 빠르고 쉽게 배포 가능하면서도 적절한 보안 잠금 상태를 유지할 수 있어야 한다. 개발, 품질 보증(QA), 그리고 생산 환경은 모두 동일한 구성으로 설정되어야 하며, 각각의 환경에서 서로 다른 자격증명을 사용하여야 한다. 해당 프로세스는 자동화되어 필요한 새로운 보안환경을 구성하는 데 필요한 노력을 최소화하여야 한다. +* 사용하지 않은 기능, 컴포넌트, 문서, 샘플을 포함하지 않는 최소한의 플랫폼을 구현하여야 한다. 사용하는 기능과 프레임워크는 삭제하거나 설치되지 않아야 한다. +* 패치 관리 프로세스의 일부로써 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트 작업을 하여야 한다.(참고. [A03 소프트웨어 공급망 체인 실패](A03_2025-Software_Supply_Chain_Failures.md)) 클라우드 스토리지 권한을 점검하여야 한다.(예시. S3 버킷 권한) +* 분리된 애플리케이션 아키텍처는 분리화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 컴포넌트와 테넌트 간 효과성과 보안성을 보장할 수 있다. +* 보안 지시자를 클라이언트로 보내야 한다. (예시. 보안 헤더) +* 자동화된 프로세스로 모든 환경에서 해당 설정들의 효과성을 검증할 수 있어야 한다. +* 백업 수단으로 과도한 에러메시지를 저장할 수 있도록 중앙 설정을 사전 구성하여야 한다. +* 만약 이런 검증사항들이 자동화되지 않았다면, 최소한 매년 수동적으로 검증되어야 한다. +* 내장된 정적 키, 코드 내 시크릿, 설정 파일, 파이트 라인 사용 대신 기반 플랫폼에서 제공하는 통합 식별 관리, 짧은 자격증명, 역할 기반 접근 매커니즘을 사용하여야 한다. + + +## 공격 시나리오 예시. + +**시나리오 1:** 어떤 애플리케이션 서버는 프로덕션 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션들은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재하며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인 한 뒤 시스템 장악이 가능하다. + +**시나리오 2:** 서버에서 디렉토리 리스팅이 활성화 되었을 때 공격자는 간단하게 디렉토리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드 할 수 있고, 이런 클래스들을 디컴파일 하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. + +**시나리오 3:** 어떤 애플리케이션 서버는 사용자에게 반환되는 스택 추적(Stack trace) 같은 자세한 에러 메시지가 표시되도록 설정되어 있다. 이는 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. + +**시나리오 #4:** 어떤 클라우드 서비스 제공자(Cloud service provider, CSP)는 기본적으로 공유 권한이 인터넷에 공개되어 있다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. (예시. 민감한 정보가 퍼블릭으로 설정된 S3 버킷에 저장되어 있을 경우 누구나 접근할 수 있다.) + + +## 참조. + +* [OWASP Testing Guide: Configuration Management](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/README) +* [OWASP Testing Guide: Testing for Error Codes](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/08-Testing_for_Error_Handling/01-Testing_For_Improper_Error_Handling) +* [Application Security Verification Standard V13 Configuration](https://github.com/OWASP/ASVS/blob/master/5.0/en/0x22-V13-Configuration.md) +* [NIST Guide to General Server Hardening](https://csrc.nist.gov/publications/detail/sp/800-123/final) +* [CIS Security Configuration Guides/Benchmarks](https://www.cisecurity.org/cis-benchmarks/) +* [Amazon S3 Bucket Discovery and Enumeration](https://blog.websecurify.com/2017/10/aws-s3-bucket-discovery.html) +* ScienceDirect: Security Misconfiguration + +## 매핑된 보안 약점(CWE). + +* [CWE-5 J2EE Misconfiguration: Data Transmission Without Encryption](https://cwe.mitre.org/data/definitions/5.html) + +* [CWE-11 ASP.NET Misconfiguration: Creating Debug Binary](https://cwe.mitre.org/data/definitions/11.html) + +* [CWE-13 ASP.NET Misconfiguration: Password in Configuration File](https://cwe.mitre.org/data/definitions/13.html) + +* [CWE-15 External Control of System or Configuration Setting](https://cwe.mitre.org/data/definitions/15.html) + +* [CWE-16 Configuration](https://cwe.mitre.org/data/definitions/16.html) + +* [CWE-260 Password in Configuration File](https://cwe.mitre.org/data/definitions/260.html) + +* [CWE-315 Cleartext Storage of Sensitive Information in a Cookie](https://cwe.mitre.org/data/definitions/315.html) + +* [CWE-489 Active Debug Code](https://cwe.mitre.org/data/definitions/489.html) + +* [CWE-526 Exposure of Sensitive Information Through Environmental Variables](https://cwe.mitre.org/data/definitions/526.html) + +* [CWE-547 Use of Hard-coded, Security-relevant Constants](https://cwe.mitre.org/data/definitions/547.html) + +* [CWE-611 Improper Restriction of XML External Entity Reference](https://cwe.mitre.org/data/definitions/611.html) + +* [CWE-614 Sensitive Cookie in HTTPS Session Without 'Secure' Attribute](https://cwe.mitre.org/data/definitions/614.html) + +* [CWE-776 Improper Restriction of Recursive Entity References in DTDs ('XML Entity Expansion')](https://cwe.mitre.org/data/definitions/776.html) + +* [CWE-942 Permissive Cross-domain Policy with Untrusted Domains](https://cwe.mitre.org/data/definitions/942.html) + +* [CWE-1004 Sensitive Cookie Without 'HttpOnly' Flag](https://cwe.mitre.org/data/definitions/1004.html) + +* [CWE-1174 ASP.NET Misconfiguration: Improper Model Validation](https://cwe.mitre.org/data/definitions/1174.html) From a86b24ac49c7c3afa049c2f6182d9fcf65c0f4f2 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Mon, 29 Dec 2025 18:24:15 +0900 Subject: [PATCH 027/167] Translated A03_2025-Software_Supply_Chain_Failures file in korean Version 1.0 --- ...A03_2025-Software_Supply_Chain_Failures.md | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md new file mode 100644 index 000000000..6ec2df353 --- /dev/null +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -0,0 +1,171 @@ +# A03:2025 소프트웨어 공급망 체인 실패![icon](../assets/TOP_10_Icons_Final_Vulnerable_Outdated_Components.png){: style="height:80px;width:80px" align="right"} + + +## 배경. + +이번 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정되었다. 2013년 TOP 10에 "A9 - 서용 중인 컴포넌트 내 알려진 취약점" 에 처음 등장한 이후, 해당 위험은 "알려진 취약점" 외에도 모든 공급망 체인 실패를 포함하도록 범위가 확장되었다. 범위가 증가함에도 불구하고, 공급망 체인 실패는 11개의 보안 약점(CWE)와 관련된 보안 취약점(CVE)으로 식별하는데 어려움을 겪고 있다. 그러나, 수집한 데이터로부터 테스트 또는 제보받은 결과 이번 카테고리는 5.19% 라는 높은 평균 사고 발생률을 보였고, 관련된 CWE로는 CWE-447: 불필요한 기능 사용, CWE-1104: 유지되지 않은 외부 컴포넌트 사용, CWE-1329: 업데이트 할 수 없는 신뢰된 컴포넌트 사용, 그리고 CWE-1398: 취약한 외부 컴포넌트 의존이 있다. + +## 점수표. + + + + + + + + + + + + + + + + + + + + + + + + + +
매칭된 보안약점(CWE) + 최대 취약점 발생률 + 평균 취약점 발생률 + 최대 테스트 커버리지 + 평균 테스트 커버리지 + 평균 가중 공격 가능성 + 평균 가중 영향도 + 총 발생 건수 + 총 CVE 건수 +
40 + 20.15% + 3.74% + 100.00% + 42.93% + 7.04 + 3.84 + 1,839,701 + 32,654 +
+ + + +## 설명. + +소프트웨어 공급망 체인 실패는 소프트웨어 개발, 배포, 업데이트하는 과정에서 발생하는 침해사고, 중단을 의미합니다. 이는 주로 외부 코드, 도구, 시스템이 신뢰하는 의존성들에서 악의적인 변경이나 취약점이 원인이 된다. + +다음과 같을 시 취약하다 판단할 수 있다. + +* 사용하는 모든 컴포넌트 버전을 추적하는 않는 경우.(클라이언트, 서버 사이드 모두 포함하고 이에는 직접 사용하는 컴포넌트 뿐만 아니라 중첩되거나 전파된 의존성들도 포함한다.) +* 소프트웨어가 취약하거나, 더이상 지원하지 않거나, 오래된 버전인 경우.(이는 OS, 웹/애플리케이션 서버, 데이터 베이스 관리 시스템(DBMS), 애플리케이션, API, 모든 컴포넌트, 런타임 환경 그리고 모든 라이브러리를 포함한다.) +* 주기적으로 취약점을 스캔하지 않거나 사용 중인 컴포넌트에 대한 보안 공지를 확인하지 않는 경우. +* 공급망 체인 내 관리 프로세스 또는 공급망 체인 변경에 대한 추적 (IDE 추적 포함) 기능이 없는 경우(IDE 확장 도구와 업데이트, 조직 내 코드 저장소 변경, 샌드박스, 이미지 또는 라이브러리 저장소, 생성 또는 저장되는 아티팩트 등). 모든 공급망 체인에 대한 영역은 문서화되어야 한다. (특히 변경에 관한 사항) +* 모든 공급망 체인 영역 대한 보안 강화 사항이 없는 경우 (특히 접근 제어, 애플리케이션 최소 권한). +* 공급망 체인 시스템에 직무 분리 사항이 없으니, 누구라도 다른 사람의 감독 없이 공급망 체인 내 코드를 작성하거나 프로덕션 환경에 배포되는 모든 과정을 진행해서는 안 된다. +* 신뢰할 수 없는 출처의 컴포넌트나 기술 스택이 프로덕션 환경에 영향을 미치는 경우 +* 기반 플랫폼, 프레임워크, 의존성을 위험 기반으로 적시에 고치거나 업그레이드 하지 않는 경우. 이는 변경 관리를 월, 분기 단위 작업 환경에서 흔히 발생하며, 취약점을 고치기 전 조직에 불필요한 위험을 수일 또는 수개월 간 노출시킬 수 있다. +* 소프트웨어 개발자가 업데이트, 업그레이드, 라이브러리 패치의 확장성을 테스트하지 않는 경우. +* 시스템의 모든 영역의 설정에 보안성이 강구되지 않은 경우 (참고. [A02:2025-잘못된 보안 설정](https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/)) +* 시스템 개발, 배포보다 CI/CD 파이프 라인이 보안성이 약한 경우 (특히 파이프 라인이 복잡할 때) + +## 방어. + +패치 관리 프로세스 내 다음과 같은 사항이 포함되어야 한다. + + + +* 전체 소프트웨어의 중앙 생성 및 관리가 가능한 소프트 웨어 구성 목록(SBOM). +* 직접적 의존성, 전파된 의존성 등 추적. (전파된 의존성 예시. 사용 중인 라이브러리에서 사용되는 의존성) +* 사용하지 않는 의존성, 불필요한 기능, 컴포넌트, 파일 그리고 문서를 지움으로써 공격 가능 범위 축소. +* OWASP Dependency Track, OWASP Dependency Check, retire.js 등과 같은 도구를 사용함으로써 클라이언트, 서버 사이드 컴포넌트 버전 지속 목록화. +* 사용 중인 컴포넌트에 대한 취약점들을 보안 취약점(CVE), 국제적 취약점 데이터 베이스(NVD), 오픈 소스 취약점(OSV) 을 통해 지속 모니터링. 이를 위해 소프트웨어 구성 분석, 소프트웨어 공급망 체인 또는 보안 집중된 소프트웨어 구성 목록(SBOM) 도구를 이용해 해당 프로세스 자동화가 가능하다. 또는 사용 중인 컴포넌트에 대한 보안 취약점 알림 구독을 통해서도 관리할 수 있다. +* 보안 링크를 통한 공식 소스와 컴포넌트 다운로드. 조작되거나 악성 컴포넌트로 변경되는 경우를 방지하기 위해 서명된 패키지 사용과 체크를 권고한다. (참고. [A08:2025-소프트웨어 그리고 데이터 무결성 실패](https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/)) +* 사용할 의존성 버전 선택이 가능하고 필요할 때 업그레이드 할 수 있어야 한다. +* 유지되지 않거나 보안 패치가 이루어지지 않는 오래된 버전의 라이브러리, 컴포넌트 모니터링. 만약 패치가 가능하지 않다면 대안을 선택해야 하는 것을 고려해야 하며, 만약 이 또한 가능하지 않다면 가상 패치된 것을 배포하여 발견된 문제에 대해 모니터링, 탐지, 방어하는 방안을 고려하여야 한다. +* CI/CD, IDE, 기타 다른 개발 도구를 주기적으로 업데이트해야 한다. +* 모든 시스템에 대한 동시 업데이트를 하지 않아야 한다. 신뢰된 제조사가 침해된 경우를 대비하여 노출을 제한하기 위해 점진적 배포나 카나리 배포를 하여야 한다. + +다음과 같은 변경 사항을 추적하기 위해 변경 관리 프로세스 또는 추적 시스템이 마련되어야 한다. + +* CI/CD 설정 (모든 빌드 도구와 파이프 라인) +* 코드 저장소 +* 샌드박스 영역 +* 개발자 IDE +* 소프트웨어 구성 목록 도구(SBOM tooling)와 생성된 아티팩트 +* 로깅 시스템과 로그 +* 소프트웨어 서비스(Saas) 같은 통합된 외부 서비스 +* 아티팩트 저장소 +* 컨테이너 레지스트리(저장소) + + +다음과 같은 시스템의 경우 보안 강화를 해야하며, 이는 다중 인증(MFA)과 식별 접근 관리(IAM) 잠금을 포함한다. + +* 코드 저장소 (백업, 보호된 브런치, 커밋된 민감 데이터를 포함한다.) +* 개발자 워크스테이션 (주기적 패치, 다중 인증(MFA), 모니터링) +* 빌드 서버와 CI/CD 서버 (직무 분리, 접근 제어, 서명된 빌드, 환경변수 내 민감 데이터, 조작된 증거 로그 등) +* 아티팩트 (무결성 보장을 위해 발신지, 서명, 타임 스탬프를 확인하고, 각각의 환경을 재구축하기 보단 아티팩트를 재배포한다. 또한 빌드가 변경 불가능한지 검증해야 한다.) +* 코드로서의 인프라 (모든 코드 관리, PR 사용과 버전 관리 포함) + +모든 조직은 애플리케이션 생애주기 또는 포트폴리오와 관련된 진행 중인 계획에 대해 모니터링, 분류, 그리고 업데이트 적용 또는 설정 변경에 대해 검증하여야 한다. + + +## 공격 시나리오 예시. + +**시나리오 1:** 신뢰된 제조사는 악성 프로그램(멀웨어)로 침해사고가 발생하였으며, 이는 우리 컴퓨터 시스템이 업그레이드 될 때 침해사고가 발생하는 결과로 이어진다. 유명한 예시는 다음과 같다. + + + +* 2019년 솔러 윈즈 침해사고는 18,000개의 조직 침해사고로 이어졌다.[https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) + +**시나리오 2:** 신뢰된 제조사는 침해사고가 발생하였으며, 이는 특정 조건이 발생하면 동작하도록 되어 있다. + + + +* 2025년에 바이빗은 15억 달러 상당을 탈취당했으며, 사고 이유는 [월렛 소프트웨어에서의 공급망 체인 공격](https://www.sygnia.co/blog/sygnia-investigation-bybit-hack/)으로 알려졌다. 이는 지갑이 사용될 때 악성행위가 동작하도록 설계되었다. + +**시나리오 3:** 2025년에 발생한 [`Shai-Hulud` 공급망 체인 공격](https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem)은 첫번째로 성공한 자기 전파형 npm 웜이다. 공격자는 유명한 패키지에 악성 프로그램 버전을 배포하였으며, 이는 post-install 스크립트를 이용해 민감 정보를 퍼블릭 깃허브 저장소로 유출하거나 탈취하는 역할을 한다. 해당 멀웨어는 피해자 환경 내에서 npm 토큰을 탐지하여 이를 이용해 자동적으로 접근 가능한 패키지의 악성 버전을 푸시한다. 해당 웜은 npm에 의해 차단되기 전 500개가 넘는 패키지 버전에 영향을 미쳤다. 이번 공격망 체인 공격은 사전적이였으며, 빠르게 전파되고 심한 데미지가 있었다. 그리고 개발자가 목표가 됨으로써 개발자 스스로가 공급망 체인 공격을 위한 중요 타깃이 될 수 있다는 것을 증명하였다. + +**시나리오 4:** 컴포넌트는 일반적으로 애플리케이션과 같은 권한으로 동작하여야 한다. 그래서 컴포넌트에 존재하는 취약점은 심각한 영향을 미치는 결과를 낳는다. 해당 취약점은 사고적이거나(예시. 코딩 에러), 고의적일 수 있다(예시. 컴포넌트 내 백도어). 몇개의 발견된 악용 가능한(exploitable) 컴포넌트 취약점은 다음과 같다. + +* CVE-2017-5638, 스트럿츠(Struts)에 2개의 원격 코드 실행 취약점이 발견되었으며, 이는 서버에 임의코드 실행이 가능한 심각한 보안 사고 원인으로 판별되었다. +* CVE-2021-44228 ("Log4Shell"), 아파치 Log4j 라이브러리에서 제로데이 원격코드 실행 취약점이 발견되었으며, 랜섬웨어, 크립토 채굴 그리고 다른 공격에 사용되는 원인으로 판별되었다. + + +## 참조 + +* [OWASP Application Security Verification Standard: V15 Secure Coding and Architecture](https://owasp.org/www-project-application-security-verification-standard/) +* [OWASP Cheat Sheet Series: Dependency Graph SBOM](https://cheatsheetseries.owasp.org/cheatsheets/Dependency_Graph_SBOM_Cheat_Sheet.html) +* [OWASP Cheat Sheet Series: Vulnerable Dependency Management](https://cheatsheetseries.owasp.org/cheatsheets/Vulnerable_Dependency_Management_Cheat_Sheet.html) +* [OWASP Dependency-Track](https://owasp.org/www-project-dependency-track/) +* [OWASP CycloneDX](https://owasp.org/www-project-cyclonedx/) +* [OWASP Application Security Verification Standard: V1 Architecture, design and threat modelling](https://owasp-aasvs.readthedocs.io/en/latest/v1.html) +* [OWASP Dependency Check (for Java and .NET libraries)](https://owasp.org/www-project-dependency-check/) +* OWASP Testing Guide - Map Application Architecture (OTG-INFO-010) +* [OWASP Virtual Patching Best Practices](https://owasp.org/www-community/Virtual_Patching_Best_Practices) +* [The Unfortunate Reality of Insecure Libraries](https://www.scribd.com/document/105692739/JeffWilliamsPreso-Sm) +* [MITRE Common Vulnerabilities and Exposures (CVE) search](https://www.cve.org) +* [National Vulnerability Database (NVD)](https://nvd.nist.gov) +* [Retire.js for detecting known vulnerable JavaScript libraries](https://retirejs.github.io/retire.js/) +* [GitHub Advisory Database](https://github.com/advisories) +* Ruby Libraries Security Advisory Database and Tools +* [SAFECode Software Integrity Controls (PDF)](https://safecode.org/publication/SAFECode_Software_Integrity_Controls0610.pdf) +* [Glassworm supply chain attack](https://thehackernews.com/2025/10/self-spreading-glassworm-infects-vs.html) +* [PhantomRaven supply chain attack campaign](https://thehackernews.com/2025/10/phantomraven-malware-found-in-126-npm.html) + + +## 매핑된 보안 약점(CWE) 목록 + +* [CWE-447 Use of Obsolete Function](https://cwe.mitre.org/data/definitions/447.html) + +* [CWE-1035 2017 Top 10 A9: Using Components with Known Vulnerabilities](https://cwe.mitre.org/data/definitions/1035.html) + +* [CWE-1104 Use of Unmaintained Third Party Components](https://cwe.mitre.org/data/definitions/1104.html) + +* [CWE-1329 Reliance on Component That is Not Updateable](https://cwe.mitre.org/data/definitions/1329.html) + +* [CWE-1357 Reliance on Insufficiently Trustworthy Component](https://cwe.mitre.org/data/definitions/1357.html) + +* [CWE-1395 Dependency on Vulnerable Third-Party Component](https://cwe.mitre.org/data/definitions/1395.html) From 18d17b1743cb30357265cafb023fb7c1894ee7ec Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Mon, 29 Dec 2025 23:12:21 +0900 Subject: [PATCH 028/167] Translate 0x02 document to Korean - draft --- ...025-What_are_Application_Security_Risks.md | 92 +++++++++---------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index df1e9d066..afa2d81c9 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -1,113 +1,109 @@ -# What are Application Security Risks? -Attackers can potentially use many different paths through your application to do harm to your business or organization. Each of these ways poses a potential risk that needs to be investigated. +# 애플리케이션 보안 위험이란 무엇인가? +공격자는 애플리케이션을 통해 다양한 경로로 비즈니스 또는 조직에 피해를 입힐 수 있다. 이러한 경로들은 조사가 필요한 잠재적 위험을 야기한다. ![Calculation diagram](../assets/2025-algorithm-diagram.png)
- Threat Agents + 위협 행위자 - Attack \ -Vectors + 공격 \ +벡터 - Exploitability + 악용 가능성 - Likelihood of Missing Security + 보안 미비 가능성

- Controls + 통제

- Technical + 기술적

- Impacts + 영향

- Business + 비즈니스

- Impacts + 영향

- By environment, \ -dynamic by situation picture + 환경에 따라, 상황에 따라 동적으로 변화 - By Application exposure (by environment + 애플리케이션 노출 수준에 따라(환경 기준) - Avg Weighted Exploit + 평균 가중 악용 - Missing Controls \ -by average Incidence rate \ -Weighed by coverage + 통제 미비를 평균 발생률로 산정하고 적용 범위로 가중 - Avg Weighted Impact + 평균 가중 영향 - By Business + 비즈니스 기준
+본 위험 등급(Risk Rating)에서는 악용 가능성, 취약점에서 보안 통제가 미비할 평균 가능성, 그리고 기술적 영향을 보편적 파라미터로 고려하였다. -In our Risk Rating we have taken into account the universal parameters of exploitability, average likelihood of missing security controls for a weakness and its technical impacts. +조직은 각기 고유하며, 해당 조직을 대상으로 하는 위협 행위자, 그들의 목표, 그리고 침해 발생 시 영향도 또한 고유하다. 공익 단체가 대외 정보 제공을 위해 콘텐츠 관리 시스템(CMS)을 사용하는 경우와, 보건의료 체계가 동일한 CMS를 민감한 건강 기록에 사용하는 경우를 비교하면, 같은 소프트웨어라 하더라도 위협 행위자와 비즈니스 영향은 크게 달라질 수 있다. 애플리케이션의 노출 수준, 상황별 위협 행위자(비즈니스 및 지역에 따른 표적 공격과 비표적 공격), 그리고 개별 비즈니스 영향을 바탕으로 조직의 위험을 이해하는 것이 중요하다. -Each organization is unique, and so are the threat actors for that organization, their goals, and the impact of any breach. If a public interest organization uses a content management system (CMS) for public information and a health system uses that same exact CMS for sensitive health records, the threat actors and business impacts can be very different for the same software. It is critical to understand the risk to your organization based on the exposure of the application, the applicable threat agents by situation picture (for targeted and undirected attacks by business and location) and the individual business impacts. +## 범주를 선택하고 순위를 매기기 위해 데이터가 사용되는 방식 -## How the data is used for selecting categories and ranking them +2017년에는 발생률(incidence rate)을 기준으로 가능성(likelihood)을 산정하여 범주를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성(Exploitability), 탐지 가능성(Detectability, 가능성에 포함), 기술적 영향(Technical Impact)을 기준으로 순위를 매겼다. 2021년에는 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. -In 2017, we selected categories by incidence rate to determine likelihood, then ranked them by team discussion based on decades of experience for Exploitability, Detectability (also likelihood), and Technical Impact. For 2021, we used data for Exploitability and (Technical) Impact from the CVSSv2 and CVSSv3 scores in the National Vulnerability Database (NVD). For 2025, we continued the same methodology that we created in 2021. +우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE별로 그룹화된 CVSS 악용(Exploit) 점수와 영향(Impact) 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. -We downloaded OWASP Dependency Check and extracted the CVSS Exploit, and Impact scores grouped by related CWEs. It took a fair bit of research and effort as all the CVEs have CVSSv2 scores, but there are flaws in CVSSv2 that CVSSv3 should address. After a certain point in time, all CVEs are assigned a CVSSv3 score as well. Additionally, the scoring ranges and formulas were updated between CVSSv2 and CVSSv3. +CVSSv2에서는 악용(Exploit)과 (기술적) 영향(Impact) 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 악용은 60%, 영향은 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 악용 6.0, 영향 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top Ten 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. -In CVSSv2, both Exploit and (Technical) Impact could be up to 10.0, but the formula would knock them down to 60% for Exploit and 40% for Impact. In CVSSv3, the theoretical max was limited to 6.0 for Exploit and 4.0 for Impact. With the weighting considered, the Impact scoring shifted higher, almost a point and a half on average in CVSSv3, and exploitability moved nearly half a point lower on average when we conducted analysis for the 2021 Top Ten. +OWASP Dependency-Check에서 추출한 결과, 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)에는 CWE에 매핑된 CVE 레코드가 약 17만 5천 건(2021년의 12만 5천 건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년의 241개에서 증가)이다. 추출된 약 22만 건의 CVE 중 16만 건에는 CVSS v2 점수가, 15만 6천 건에는 CVSS v3 점수가, 6천 건에는 CVSS v4 점수가 있었다. 다수의 CVE가 여러 버전의 점수를 동시에 보유하므로, 점수 건수 합계는 22만 건을 초과한다. -There are approximately 175k records (up from 125k in 2021) of CVEs mapped to CWEs in the National Vulnerability Database (NVD), extracted from OWASP Dependency Check. Additionally, there are 643 unique CWEs mapped to CVEs (up from 241 in 2021). Within the nearly 220k CVEs that were extracted, 160k had CVSS v2 scores, 156k had CVSS v3 scores, and 6k had CVSS v4 scores. Many CVEs have multiple scores, which is why they total more than 220k. +Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화한 뒤, 악용 점수와 영향 점수 모두에 대해 CVSSv3 점수를 보유한 비율과 나머지 CVSSv2 점수 보유 비율을 가중치로 적용하여 전체 평균을 산출하였다. 이렇게 산출한 평균을 데이터셋의 CWE에 매핑하여, 위험 방정식의 나머지 절반에 해당하는 악용(Exploit) 및 (기술적) 영향(Technical Impact) 점수로 사용하였다. -For the Top Ten 2025, we calculated average exploit and impact scores in the following manner. We grouped all the CVEs with CVSS scores by CWE and weighted both exploit and impact scores by the percentage of the population that had CVSSv3, as well as the remaining population with CVSSv2 scores, to get an overall average. We mapped these averages to the CWEs in the dataset to use as Exploit and (Technical) Impact scoring for the other half of the risk equation. +왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *악용(Exploit)* 또는 *영향(Impact)* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top Ten 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. -Why not use CVSS v4.0, you may ask? That’s because the scoring algorithm was fundamentally changed, and it no longer easily provides the *Exploit* or *Impact* scores as CVSSv2 and CVSSv3 do. We will attempt to figure out a way to use CVSS v4.0 scoring for future versions of the Top Ten, but we were unable to determine a timely way to do so for the 2025 edition. +발생률(incidence rate)은 일정 기간 동안 조직이 테스트한 애플리케이션 모집단에서, 각 CWE에 취약한 애플리케이션의 비율로 산정하였다. 다시 말해, 우리는 빈도(frequency), 즉 한 애플리케이션에서 문제가 몇 번 발견되는지는 사용하지 않는다. 관심 대상은 애플리케이션 모집단 중 각 CWE가 발견된 애플리케이션의 비율이다. -For the incidence rate, we calculated the percentage of applications vulnerable to each CWE from the population tested by an org for a period of time. As a reminder, we are not using frequency (or how many times an issue appears in an application), we are interested in what percentage of the population of applications were found to have each CWE. +적용 범위(coverage)는 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율로 산정한다. 적용 범위가 높을수록 표본 크기가 모집단을 더 잘 대표하므로, 산정된 발생률이 정확하다는 보증 수준이 더 강해진다. -For coverage we look at the percentage of applications tested by all organizations for a given CWE. The higher the calculated coverage, the stronger the assurance that the incidence rate is accurate as the sample size is more representative of the population. +이번 판에서 사용한 공식은 2021년과 유사하되, 일부 가중치가 변경되었다: +(최대 발생률 % * 1000) + (최대 적용 범위 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 -The formula that we used for this iteration is similar to 2021, with some weighting changes: -(Max Incidence Rate % * 1000) + (Max Coverage % * 100) + (Avg Exploit * 10) + (Avg Impact * 20) + (Sum Occurrences / 10000) = Risk Score +산정된 점수는 접근 통제 실패(Broken Access Control) 범주에서 621.60으로 가장 높았고, 메모리 관리 오류(Memory Management Errors) 범주에서 271.08로 가장 낮았다. -The calculated scores ranged from 621.60 for the category of Broken Access Control to 271.08 for Memory Management Errors. +이는 완벽한 체계는 아니지만, 위험 범주의 순위를 매기는 데 유용하다. -This is not a perfect system, but it is valuable for ranking risk categories. +추가로 커지고 있는 과제 중 하나는 “애플리케이션”의 정의이다. 업계가 마이크로서비스와 같이 전통적인 애플리케이션보다 더 작은 구성요소로 이루어진 아키텍처로 전환함에 따라, 산정이 더 어려워지고 있다. 예를 들어 조직이 코드 리포지토리를 테스트하는 경우, 무엇을 애플리케이션으로 간주해야 하는가? CVSSv4의 확산과 마찬가지로, Top Ten의 다음 판에서는 끊임없이 변화하는 산업 환경을 반영하기 위해 분석과 점수 산정을 조정해야 할 수 있다. -One additional challenge that is growing is the definition of an "application". As the industry shifts to different architectures that consist of micro-services and other implementations that are smaller than a traditional application, calculations are more difficult. For instance, if an organization is testing code repositories, what does it consider an application? Similar to the growth of CVSSv4, the next edition of the Top Ten may need to adjust the analysis and scoring to account for a constantly changing industry. +## 데이터 요인 -## Data Factors +Top 10 각 범주에는 다음과 같은 데이터 요인이 제시되며, 의미는 다음과 같다: -There are data factors that are listed for each of the Top Ten Categories, here is what they mean: +**매핑된 CWE(CWEs Mapped):** Top Ten 팀이 해당 범주에 매핑한 CWE의 개수. -**CWEs Mapped:** The number of CWEs mapped to a category by the Top Ten team. +**발생률(Incidence Rate):** 발생률은 해당 연도에 그 조직이 테스트한 모집단에서, 해당 CWE에 취약한 애플리케이션의 비율이다. -**Incidence Rate:** Incidence rate is the percentage of applications vulnerable to that CWE from the population tested by that org for that year. +**가중 악용(Weighted Exploit):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 악용(Exploit) 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**Weighted Exploit:** The Exploit sub-score from CVSSv2 and CVSSv3 scores assigned to CVEs mapped to CWEs, normalized, and placed on a 10pt scale. +**가중 영향(Weighted Impact):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향(Impact) 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**Weighted Impact:** The Impact sub-score from CVSSv2 and CVSSv3 scores assigned to CVEs mapped to CWEs, normalized, and placed on a 10pt scale. +**(테스트) 적용 범위((Testing) Coverage):** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. -**(Testing) Coverage:** The percentage of applications tested by all organizations for a given CWE. +**총 발생 건수(Total Occurrences):** 범주에 매핑된 CWE가 발견된 애플리케이션의 총 개수. -**Total Occurrences:** Total number of applications found to have the CWEs mapped to a category. +**총 CVE(Total CVEs):** 해당 범주에 매핑된 CWE에 매핑된 NVD DB 내 CVE의 총 개수. -**Total CVEs:** Total number of CVEs in the NVD DB that were mapped to the CWEs mapped to a category. - -**Formula:** (Max Incidence Rate % * 1000) + (Max Coverage % * 100) + (Avg Exploit * 10) + (Avg Impact * 20) + (Sum Occurrences / 10000) = Risk Score +**공식(Formula):** (최대 발생률 % * 1000) + (최대 적용 범위 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 From af53e18a3c6468d1a5ec1a29c680c6bcd434c56f Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:52:47 +0900 Subject: [PATCH 029/167] Translated A02 Misconfigration.md file in korean Version 1.1 --- .../ko/A02_2025-Security_Misconfiguration.md | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index fa60cefe9..2ddf21d74 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -3,7 +3,7 @@ ## 배경. -지난 버전에서 부터 5위로 올라왔으며, 테스트한 모든 애플리케이션에서 어떤 형태의 잘못된 보안 설정이 발견되었다. 이번 카테고리 내에서의 평균 사고 발생률은 3% 이며, 71만 9천(719k)개가 넘는 보안 약점(CWE)이 발견되었다. 설정 가능한 소프트웨어 쪽으로 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 일이 아니다. 관심이 갈만한 CWE는 `CWE-16: 설정` 그리고 `CWE-611: 부적절한 XML 외부 엔티티 참조 제한(XXE)`가 있다. +지난 버전에서부터 5위로 올라왔으며, 테스트된 모든 애플리케이션에서 어떠한 형태의 잘못된 보안 설정이 발견되었다. 이번 카테고리 내에서의 평균 사고 발생률은 3% 이며, 71만 9천(719k)개가 넘는 CWE가 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 `CWE-16: 설정` 그리고 `CWE-611: 부적절한 XML 외부 엔티티 참조 제한(XXE)`이 있다. ## 점수표. @@ -11,7 +11,7 @@ - @@ -21,9 +21,9 @@ - - @@ -31,23 +31,23 @@ - - - - - - - -
매칭된 보안약점(CWE) + 해당되는 CWE 개수 최대 취약점 발생률 평균 테스트 커버리지 평균 가중 공격 가능성 + 가중 평균 악용도 평균 가중 영향도 + 가중 평균 영향도 총 발생 건수
40 + 16 20.15% + 27.70% 3.74% + 3.00% 100.00% 42.93% + 52.35% 7.04 + 7.96 3.84 + 3.97 1,839,701 + 719,084 32,654 + 1,375
@@ -56,48 +56,48 @@ ## 설명. -잘못된 보안 설정은 보안 관점 그리고 취약점 관점에서 시스템, 애플리케이션, 클라우드 서비스 설정을 적절하지 않게 할 때 발생한다. +잘못된 보안 설정은 보안 관점에서 시스템, 애플리케이션, 클라우드 서비스 설정이 잘못되어 취약점이 발생하는 것을 말한다. -다음과 같은 경우 애플리케이션은 취약할 수 있다 +다음과 같은 경우 애플리케이션은 취약할 수 있다. -* 애플리케이션 스택 어느 부분에서 적절한 보안성이 강구되지 않거나 또는 클라우드 서비스에 적절하지 않은 권한이 설정된 경우. +* 애플리케이션 스택 부분 또는 클라우드 서비스 내 부적절한 권한 설정에 적절한 보안대책이 없는 경우. * 불필요한 기능이 활성화 또는 설치된 경우. (예시. 불필요 포트, 서비스, 페이지, 계정, 테스트 프레임워크 또는 권한) -* 기본 계정, 패스워드가 여전히 활성화되어 있거나 변경되지 않은 경우 -* 과도한 에러메시지를 처리할 약한 중앙 설정으로 에러 처리 과정을 통해 스택 추적(Stack trace)이나 과도한 에러 정보 메시지가 유저에게 전달되는 경우. -* 업그레이드된 시스템에서 최신 보안 기능이 비활성화 되어 있거나 안전하기 설정되지 않은 경우. -* 이전 버전과의 호환성을 위해 안전하지 않은 설정을 하는 경우. -* 애플리케이션 서버 내 보안 설정, 애플리케이션 프레임워크(예시. 스트럿츠(Struts), 스프링(Spring), ASP.NET), 라이브러리, 데이터베이스 등에서 보안 값이 설정되지 않은 경우. +* 기본 계정, 패스워드가 활성화되어 있거나 변경되지 않은 경우 +* 과도한 에러메시지를 처리할 약한 중앙 설정으로 에러 처리 과정을 통해 스택 추적(Stack trace)이나 과도한 에러 정보 메시지가 사용자에게 전달되는 경우. +* 업그레이드된 시스템에서 최신 보안 기능이 비활성화 되어 있거나 안전하게 설정되지 않은 경우. +* 이전 버전과의 호환성을 우선시하여 안전하지 않은 설정을 하는 경우. +* 애플리케이션 서버 내 보안 설정, 애플리케이션 프레임워크(예시. 스트럿츠(Struts), 스프링(Spring), ASP.NET), 라이브러리, 데이터베이스 등에서 보안 설정이 되지 않은 경우. * 서버가 보안 헤더 또는 지시자를 전달하지 않거나 보안 값이 설정되지 않은 경우. -일관되고 반복 가능한 애플리케이션 보안설정 강화 절차가 없다면 시스템은 위험한 상태다. +일관되고 반복 가능한 애플리케이션 보안설정 강화 절차가 없다면 시스템은 위험한 상태에 있다. ## 방어. -보안성이 강구된 설치 프로세스는 다음 항목들을 포함하여 구현되어야 한다 +보안성이 강구된 설치 프로세스는 다음 항목들을 포함하여 구현한다. - -* 반복 가능한 보안 강화 프로세스를 통해 다른 환경에 빠르고 쉽게 배포 가능하면서도 적절한 보안 잠금 상태를 유지할 수 있어야 한다. 개발, 품질 보증(QA), 그리고 생산 환경은 모두 동일한 구성으로 설정되어야 하며, 각각의 환경에서 서로 다른 자격증명을 사용하여야 한다. 해당 프로세스는 자동화되어 필요한 새로운 보안환경을 구성하는 데 필요한 노력을 최소화하여야 한다. -* 사용하지 않은 기능, 컴포넌트, 문서, 샘플을 포함하지 않는 최소한의 플랫폼을 구현하여야 한다. 사용하는 기능과 프레임워크는 삭제하거나 설치되지 않아야 한다. -* 패치 관리 프로세스의 일부로써 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트 작업을 하여야 한다.(참고. [A03 소프트웨어 공급망 체인 실패](A03_2025-Software_Supply_Chain_Failures.md)) 클라우드 스토리지 권한을 점검하여야 한다.(예시. S3 버킷 권한) -* 분리된 애플리케이션 아키텍처는 분리화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 컴포넌트와 테넌트 간 효과성과 보안성을 보장할 수 있다. +* 반복 가능한 보안 강화 프로세스는 적절하게 보안 설정이된 다른 환경에 빠르고 쉽게 배포 가능해야 한다. 개발, 품질 보증(QA), 그리고 프로덕션 환경은 모두 동일한 구성으로 설정하며, 각각의 환경에서 서로 다른 자격증명을 사용한다. 해당 프로세스는 자동화되어 요구되는 새로운 보안환경을 구성하는 데 필요한 노력을 최소화 한다. +* 사용하지 않은 기능, 컴포넌트, 문서, 샘플을 포함하지 않는 최소한의 플랫폼을 구현한다. 사용하지 않는 기능과 프레임워크는 삭제하거나 설치되지 않아야 한다. +* 패치 관리 프로세스의 일부로써 모든 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트를 한다.(참고. [A03 소프트웨어 공급망 체인 실패](A03_2025-Software_Supply_Chain_Failures.md)) 클라우드 스토리지 권한을 점검한다.(예시. S3 버킷 권한) +* 분리된 애플리케이션 아키텍처는 분리화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 컴포넌트와 테넌트 간 효과성과 보안성을 보장한다. * 보안 지시자를 클라이언트로 보내야 한다. (예시. 보안 헤더) -* 자동화된 프로세스로 모든 환경에서 해당 설정들의 효과성을 검증할 수 있어야 한다. -* 백업 수단으로 과도한 에러메시지를 저장할 수 있도록 중앙 설정을 사전 구성하여야 한다. -* 만약 이런 검증사항들이 자동화되지 않았다면, 최소한 매년 수동적으로 검증되어야 한다. -* 내장된 정적 키, 코드 내 시크릿, 설정 파일, 파이트 라인 사용 대신 기반 플랫폼에서 제공하는 통합 식별 관리, 짧은 자격증명, 역할 기반 접근 매커니즘을 사용하여야 한다. +* 자동화된 프로세스로 모든 환경에서 해당 설정들의 효과성을 검증한다. +* 백업 수단로써 과도한 에러메시지를 저장할 수 있도록 중앙 설정을 사전 구성한다. +* 만약 이런 검증사항들이 자동화되지 않았다면, 최소한 매년 수동적으로 검증한다. +* 내장된 정적 키, 또는 코드, 설정 파일, 파이프 라인 내 자격증명 사용 대신 기반 플랫폼에서 제공하는 통합 식별 관리, 짧은 사용기간의 자격증명, 역할 기반 접근 매커니즘을 사용한다. ## 공격 시나리오 예시. -**시나리오 1:** 어떤 애플리케이션 서버는 프로덕션 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션들은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재하며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인 한 뒤 시스템 장악이 가능하다. +**시나리오 1:** 프로덕션 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재한다고 알려져 있으며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인 한 뒤 시스템 장악이 가능하다. -**시나리오 2:** 서버에서 디렉토리 리스팅이 활성화 되었을 때 공격자는 간단하게 디렉토리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드 할 수 있고, 이런 클래스들을 디컴파일 하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. +**시나리오 2:** 서버에서 디렉토리 리스팅이 활성화 되었을 때 공격자는 단순하게 디렉토리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드 할 수 있고, 이런 클래스들을 디컴파일 하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. -**시나리오 3:** 어떤 애플리케이션 서버는 사용자에게 반환되는 스택 추적(Stack trace) 같은 자세한 에러 메시지가 표시되도록 설정되어 있다. 이는 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. +**시나리오 3:** 사용자에게 반환되는 스택 추적(Stack trace) 같은 자세한 에러 메시지가 표시되도록 설정되어 있는 경우 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. -**시나리오 #4:** 어떤 클라우드 서비스 제공자(Cloud service provider, CSP)는 기본적으로 공유 권한이 인터넷에 공개되어 있다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. (예시. 민감한 정보가 퍼블릭으로 설정된 S3 버킷에 저장되어 있을 경우 누구나 접근할 수 있다.) +**시나리오 #4:** 클라우드 서비스 제공자(Cloud service provider, CSP)는 기본적으로 인터넷에 공유 자원을 공개한다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. (예시. 민감한 정보가 퍼블릭으로 설정된 S3 버킷에 저장되어 있을 경우 누구나 접근할 수 있다.) +// A cloud service provider (CSP) defaults to having sharing permissions open to the Internet 부분을 공유 권한이 인터넷에 공개되어 있다. 가 아닌 CSP는 기본적으로 인터넷에 공유 자원을 공개한다. 로 해석했습니다. ## 참조. From 0d10f029c53bd05aaf26a12de60f7edca516e738 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:55:09 +0900 Subject: [PATCH 030/167] Delete 2025/docs/ko/A01_2025-Broken_Access_Control.md --- .../docs/ko/A01_2025-Broken_Access_Control.md | 216 ------------------ 1 file changed, 216 deletions(-) delete mode 100644 2025/docs/ko/A01_2025-Broken_Access_Control.md diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md deleted file mode 100644 index 43e4d52a9..000000000 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ /dev/null @@ -1,216 +0,0 @@ -# A01:2025 불충분한 접근 제어![icon](../assets/TOP_10_Icons_Final_Broken_Access_Control.png){: style="height:80px;width:80px" align="right"} - - - -## 배경. - -불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 어떠한 형태로든 불충분한 접근 제어 취약점이 발견되었으며, 관심이 갈만한 보안약점(CWE)은 CWE-200: 비인기자에게 민감정보 노출, CWE-201: 전송된 데이터로부터 민감정보 노출, CWE-918: 서버측 요청 위조(SSRF), 그리고 CWE-352: 크로스 사이트 요청 위조(CSRF) 가 있다. 해당 카테고리는 제공받은 데이터 기준 발성 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. - -## 점수표. - - - - - - - - - - - - - - - - - - - - - - - - - -
매칭된 보안약점(CWE) - 최대 취약점 발생률 - 평균 취약점 발생률 - 최대 테스트 커버리지 - 평균 테스트 커버리지 - 평균 가중 공격 가능성 - 평균 가중 영향도 - 총 발생 건수 - 총 CVE 건수 -
40 - 20.15% - 3.74% - 100.00% - 42.93% - 7.04 - 3.84 - 1,839,701 - 32,654 -
- - - -## 설명. - -접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 불충분한 접근제어는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제(파괴), 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔한 불충분한 접근 제어 취약점은 리스트는 다음과 같다: - -* 최소 권한 원칙 위반, 흔히 알려진 기본적 우선 거부(Deny by Default)는 오직 허가된 기능, 역할, 사용자들에게만 허용된 자원 접근이 가능해야 한다. 그러나 모두에게 허가되거나 권한이 필요없는 자에게도 권한이 부여된 경우 -* 수정된 URL, 내부 애플리케이션 상태, HTML 페이지 또는 공격 도구를 이용한 수정된 API 요청을 이용한 접근제어 로직 우회가 가능한 경우(파라미터 위조 또는 브라우징 강제) -* 다른 사용자 계정을 조회 또는 수정할 수 있는 고유 식별자 제공하는 경우(안전하지 않은 직접 객체 참조, Insecure Direct Object References) -* POST, PUT 그리고 DELETE에 대한 접근 가능한 API에 접근 제어 로직이 없는 경우 -* 권한 상승. 로그인 과정 없이 다른 유저로 가장하거나 또는 사용자가 보유한 이상의 권한을 획득하는 것(예시. 관리자 접근 권한) -* 메타데이터 위조, JSON 웹 토큰(JWT), 접근 통제 토큰, 쿠키 또는 히든 필드 값을 수정하여 재전송 또는 위조함으로써 권한 상승을 하는 경우 또는 JWT 무효화 남용하는 경우 -* 교차 출처 자원 공유 (CORS, Cross-Origin Resource Sharing)의 잘못된 설정으로 비인가자 또는 비신뢰 출처로부터 API 접근을 허용하는 경우 -* 브라우징 강제 (URL 예측)는 인증이 필요한 페이지에 인증없이 접근하거나, 권한이 필요한 페이지에 일반 유저가 접근할 경우 - - -## 방어(Prevent). - -접근 제어는 공격자가 접근 제어 로직 또는 메타데이터를 수정할 수 없는 곳에서 신뢰할 수 있는 서버측 코드나 서버리스 API들로 구현될 때 효과적이다. - - - -* 공개 리소스 제외 모든 리소스는 거부 우선 정책(Deny By Default)을 따라야 한다. -* 접근통제 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 자원 검증 사용 최소화해야 한다. -* 모델 접근 제어는 소유권에 의해 행해져야 하며, 다른 사용자에 의해 레코드 생성, 읽기, 갱신, 삭제가 이루어져선 안 된다. -* 애플리케이션의 고유한 비즈니스 제한 요구사항은 도메인 모델에 의해 강제되어야 한다. -* 웹 서버 디렉토리 리스팅 비활성화 여부, 파일 메타데이터 검증(예시. .git 디렉토리), 그리고 백업 파일이 웹 루트에 존재하는지 확인해야 한다. -* 불충분한 접근 제어 로그 기록 및 적절한 경우엔 관리자에게 경고 알림 (예시. 반복적 실패 또는 비정상적 접근 시도) -* API 및 컨트롤러 속도 제한 구현 하여 자동화된 공격 툴 피해 최소화해야 한다. -* 상태기반 세션 식별자는 로그아웃 후 무효화되어야 한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격자를 위한 공격 표면 및 기회를 최소화해야 하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려해야 하며, OAuth 표준에 따른 토큰 취소도 고려하여야 한다. -* 간단하고 선언적 접근 제어를 제공하는 확립된 툴킷과 패턴을 사용해야 한다. -* 개발자와 QA 스태프는 보유 중인 시스템과 통합적 테스트에서 함수적 접근 제어을 포함하여야 한다. -## 예시 공격 시나리오. - -**시나리오 1:** 어떤 애플리케이션은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다: - - -``` -pstmt.setString(1, request.getParameter("acct")); -ResultSet results = pstmt.executeQuery( ); -``` - - -공격자는 원하는 계정 정보를 전달하기 위해 간단하게 'acct' 파라미터를 변조할 수 있으며, 만약 해당 파라미터가 완벽하게 검증되지 않았을 시 공격자는 모든 사용자 계정 정보에 접근 가능하다. - - -``` -https://example.com/app/accountInfo?acct=notmyacct -``` - - -**시나리오 2:** 공격자는 간단하게 목적 URL로 브라우징을 강제할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. - - -``` -https://example.com/app/getappInfo -https://example.com/app/admin_getappInfo -``` - - -먄약 인증되지 않은 유저가 해당 페이지(/app/getappInfo) 접근이 가능하다면, 이건 보안 취약점으로 간주되고, 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이것도 보안 취약점으로 간주된다.(/app/admin_getappInfo) - -**시나리오 3:** 애플리케이션이 프론트 엔드에서만 접근 제어를 하는 경우. 공격자가 브라우저에서 동작하는 자바 스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없다면, 커멘드 라인에서 간단하게 curl 명령어를 실행하면 된다: - -``` -$ curl https://example.com/app/admin_getappInfo -``` - - - - -## 참조. - -* [OWASP Proactive Controls: C1: Implement Access Control](https://top10proactive.owasp.org/archive/2024/the-top-10/c1-accesscontrol/) -* [OWASP Application Security Verification Standard: V8 Authorization](https://github.com/OWASP/ASVS/blob/master/5.0/en/0x17-V8-Authorization.md) -* [OWASP Testing Guide: Authorization Testing](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/README) -* [OWASP Cheat Sheet: Authorization](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html) -* [PortSwigger: Exploiting CORS misconfiguration](https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties) -* [OAuth: Revoking Access](https://www.oauth.com/oauth2-servers/listing-authorizations/revoking-access/) - - -## 매칭된 보안약점(CWE) 목록. - -* [CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')](https://cwe.mitre.org/data/definitions/22.html) - -* [CWE-23 Relative Path Traversal](https://cwe.mitre.org/data/definitions/23.html) - -* [CWE-36 Absolute Path Traversal](https://cwe.mitre.org/data/definitions/36.html) - -* [CWE-59 Improper Link Resolution Before File Access ('Link Following')](https://cwe.mitre.org/data/definitions/59.html) - -* [CWE-61 UNIX Symbolic Link (Symlink) Following](https://cwe.mitre.org/data/definitions/61.html) - -* [CWE-65 Windows Hard Link](https://cwe.mitre.org/data/definitions/65.html) - -* [CWE-200 Exposure of Sensitive Information to an Unauthorized Actor](https://cwe.mitre.org/data/definitions/200.html) - -* [CWE-201 Exposure of Sensitive Information Through Sent Data](https://cwe.mitre.org/data/definitions/201.html) - -* [CWE-219 Storage of File with Sensitive Data Under Web Root](https://cwe.mitre.org/data/definitions/219.html) - -* [CWE-276 Incorrect Default Permissions](https://cwe.mitre.org/data/definitions/276.html) - -* [CWE-281 Improper Preservation of Permissions](https://cwe.mitre.org/data/definitions/281.html) - -* [CWE-282 Improper Ownership Management](https://cwe.mitre.org/data/definitions/282.html) - -* [CWE-283 Unverified Ownership](https://cwe.mitre.org/data/definitions/283.html) - -* [CWE-284 Improper Access Control](https://cwe.mitre.org/data/definitions/284.html) - -* [CWE-285 Improper Authorization](https://cwe.mitre.org/data/definitions/285.html) - -* [CWE-352 Cross-Site Request Forgery (CSRF)](https://cwe.mitre.org/data/definitions/352.html) - -* [CWE-359 Exposure of Private Personal Information to an Unauthorized Actor](https://cwe.mitre.org/data/definitions/359.html) - -* [CWE-377 Insecure Temporary File](https://cwe.mitre.org/data/definitions/377.html) - -* [CWE-379 Creation of Temporary File in Directory with Insecure Permissions](https://cwe.mitre.org/data/definitions/379.html) - -* [CWE-402 Transmission of Private Resources into a New Sphere ('Resource Leak')](https://cwe.mitre.org/data/definitions/402.html) - -* [CWE-424 Improper Protection of Alternate Path](https://cwe.mitre.org/data/definitions/424.html) - -* [CWE-425 Direct Request ('Forced Browsing')](https://cwe.mitre.org/data/definitions/425.html) - -* [CWE-441 Unintended Proxy or Intermediary ('Confused Deputy')](https://cwe.mitre.org/data/definitions/441.html) - -* [CWE-497 Exposure of Sensitive System Information to an Unauthorized Control Sphere](https://cwe.mitre.org/data/definitions/497.html) - -* [CWE-538 Insertion of Sensitive Information into Externally-Accessible File or Directory](https://cwe.mitre.org/data/definitions/538.html) - -* [CWE-540 Inclusion of Sensitive Information in Source Code](https://cwe.mitre.org/data/definitions/540.html) - -* [CWE-548 Exposure of Information Through Directory Listing](https://cwe.mitre.org/data/definitions/548.html) - -* [CWE-552 Files or Directories Accessible to External Parties](https://cwe.mitre.org/data/definitions/552.html) - -* [CWE-566 Authorization Bypass Through User-Controlled SQL Primary Key](https://cwe.mitre.org/data/definitions/566.html) - -* [CWE-601 URL Redirection to Untrusted Site ('Open Redirect')](https://cwe.mitre.org/data/definitions/601.html) - -* [CWE-615 Inclusion of Sensitive Information in Source Code Comments](https://cwe.mitre.org/data/definitions/615.html) - -* [CWE-639 Authorization Bypass Through User-Controlled Key](https://cwe.mitre.org/data/definitions/639.html) - -* [CWE-668 Exposure of Resource to Wrong Sphere](https://cwe.mitre.org/data/definitions/668.html) - -* [CWE-732 Incorrect Permission Assignment for Critical Resource](https://cwe.mitre.org/data/definitions/732.html) - -* [CWE-749 Exposed Dangerous Method or Function](https://cwe.mitre.org/data/definitions/749.html) - -* [CWE-862 Missing Authorization](https://cwe.mitre.org/data/definitions/862.html) - -* [CWE-863 Incorrect Authorization](https://cwe.mitre.org/data/definitions/863.html) - -* [CWE-918 Server-Side Request Forgery (SSRF)](https://cwe.mitre.org/data/definitions/918.html) - -* [CWE-922 Insecure Storage of Sensitive Information](https://cwe.mitre.org/data/definitions/922.html) - -* [CWE-1275 Sensitive Cookie with Improper SameSite Attribute](https://cwe.mitre.org/data/definitions/1275.html) From 8902d9c9a6fe141cee0ec30ae4077024af922859 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:55:21 +0900 Subject: [PATCH 031/167] Delete 2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md --- ...A03_2025-Software_Supply_Chain_Failures.md | 171 ------------------ 1 file changed, 171 deletions(-) delete mode 100644 2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md deleted file mode 100644 index 6ec2df353..000000000 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ /dev/null @@ -1,171 +0,0 @@ -# A03:2025 소프트웨어 공급망 체인 실패![icon](../assets/TOP_10_Icons_Final_Vulnerable_Outdated_Components.png){: style="height:80px;width:80px" align="right"} - - -## 배경. - -이번 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정되었다. 2013년 TOP 10에 "A9 - 서용 중인 컴포넌트 내 알려진 취약점" 에 처음 등장한 이후, 해당 위험은 "알려진 취약점" 외에도 모든 공급망 체인 실패를 포함하도록 범위가 확장되었다. 범위가 증가함에도 불구하고, 공급망 체인 실패는 11개의 보안 약점(CWE)와 관련된 보안 취약점(CVE)으로 식별하는데 어려움을 겪고 있다. 그러나, 수집한 데이터로부터 테스트 또는 제보받은 결과 이번 카테고리는 5.19% 라는 높은 평균 사고 발생률을 보였고, 관련된 CWE로는 CWE-447: 불필요한 기능 사용, CWE-1104: 유지되지 않은 외부 컴포넌트 사용, CWE-1329: 업데이트 할 수 없는 신뢰된 컴포넌트 사용, 그리고 CWE-1398: 취약한 외부 컴포넌트 의존이 있다. - -## 점수표. - - - - - - - - - - - - - - - - - - - - - - - - - -
매칭된 보안약점(CWE) - 최대 취약점 발생률 - 평균 취약점 발생률 - 최대 테스트 커버리지 - 평균 테스트 커버리지 - 평균 가중 공격 가능성 - 평균 가중 영향도 - 총 발생 건수 - 총 CVE 건수 -
40 - 20.15% - 3.74% - 100.00% - 42.93% - 7.04 - 3.84 - 1,839,701 - 32,654 -
- - - -## 설명. - -소프트웨어 공급망 체인 실패는 소프트웨어 개발, 배포, 업데이트하는 과정에서 발생하는 침해사고, 중단을 의미합니다. 이는 주로 외부 코드, 도구, 시스템이 신뢰하는 의존성들에서 악의적인 변경이나 취약점이 원인이 된다. - -다음과 같을 시 취약하다 판단할 수 있다. - -* 사용하는 모든 컴포넌트 버전을 추적하는 않는 경우.(클라이언트, 서버 사이드 모두 포함하고 이에는 직접 사용하는 컴포넌트 뿐만 아니라 중첩되거나 전파된 의존성들도 포함한다.) -* 소프트웨어가 취약하거나, 더이상 지원하지 않거나, 오래된 버전인 경우.(이는 OS, 웹/애플리케이션 서버, 데이터 베이스 관리 시스템(DBMS), 애플리케이션, API, 모든 컴포넌트, 런타임 환경 그리고 모든 라이브러리를 포함한다.) -* 주기적으로 취약점을 스캔하지 않거나 사용 중인 컴포넌트에 대한 보안 공지를 확인하지 않는 경우. -* 공급망 체인 내 관리 프로세스 또는 공급망 체인 변경에 대한 추적 (IDE 추적 포함) 기능이 없는 경우(IDE 확장 도구와 업데이트, 조직 내 코드 저장소 변경, 샌드박스, 이미지 또는 라이브러리 저장소, 생성 또는 저장되는 아티팩트 등). 모든 공급망 체인에 대한 영역은 문서화되어야 한다. (특히 변경에 관한 사항) -* 모든 공급망 체인 영역 대한 보안 강화 사항이 없는 경우 (특히 접근 제어, 애플리케이션 최소 권한). -* 공급망 체인 시스템에 직무 분리 사항이 없으니, 누구라도 다른 사람의 감독 없이 공급망 체인 내 코드를 작성하거나 프로덕션 환경에 배포되는 모든 과정을 진행해서는 안 된다. -* 신뢰할 수 없는 출처의 컴포넌트나 기술 스택이 프로덕션 환경에 영향을 미치는 경우 -* 기반 플랫폼, 프레임워크, 의존성을 위험 기반으로 적시에 고치거나 업그레이드 하지 않는 경우. 이는 변경 관리를 월, 분기 단위 작업 환경에서 흔히 발생하며, 취약점을 고치기 전 조직에 불필요한 위험을 수일 또는 수개월 간 노출시킬 수 있다. -* 소프트웨어 개발자가 업데이트, 업그레이드, 라이브러리 패치의 확장성을 테스트하지 않는 경우. -* 시스템의 모든 영역의 설정에 보안성이 강구되지 않은 경우 (참고. [A02:2025-잘못된 보안 설정](https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/)) -* 시스템 개발, 배포보다 CI/CD 파이프 라인이 보안성이 약한 경우 (특히 파이프 라인이 복잡할 때) - -## 방어. - -패치 관리 프로세스 내 다음과 같은 사항이 포함되어야 한다. - - - -* 전체 소프트웨어의 중앙 생성 및 관리가 가능한 소프트 웨어 구성 목록(SBOM). -* 직접적 의존성, 전파된 의존성 등 추적. (전파된 의존성 예시. 사용 중인 라이브러리에서 사용되는 의존성) -* 사용하지 않는 의존성, 불필요한 기능, 컴포넌트, 파일 그리고 문서를 지움으로써 공격 가능 범위 축소. -* OWASP Dependency Track, OWASP Dependency Check, retire.js 등과 같은 도구를 사용함으로써 클라이언트, 서버 사이드 컴포넌트 버전 지속 목록화. -* 사용 중인 컴포넌트에 대한 취약점들을 보안 취약점(CVE), 국제적 취약점 데이터 베이스(NVD), 오픈 소스 취약점(OSV) 을 통해 지속 모니터링. 이를 위해 소프트웨어 구성 분석, 소프트웨어 공급망 체인 또는 보안 집중된 소프트웨어 구성 목록(SBOM) 도구를 이용해 해당 프로세스 자동화가 가능하다. 또는 사용 중인 컴포넌트에 대한 보안 취약점 알림 구독을 통해서도 관리할 수 있다. -* 보안 링크를 통한 공식 소스와 컴포넌트 다운로드. 조작되거나 악성 컴포넌트로 변경되는 경우를 방지하기 위해 서명된 패키지 사용과 체크를 권고한다. (참고. [A08:2025-소프트웨어 그리고 데이터 무결성 실패](https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/)) -* 사용할 의존성 버전 선택이 가능하고 필요할 때 업그레이드 할 수 있어야 한다. -* 유지되지 않거나 보안 패치가 이루어지지 않는 오래된 버전의 라이브러리, 컴포넌트 모니터링. 만약 패치가 가능하지 않다면 대안을 선택해야 하는 것을 고려해야 하며, 만약 이 또한 가능하지 않다면 가상 패치된 것을 배포하여 발견된 문제에 대해 모니터링, 탐지, 방어하는 방안을 고려하여야 한다. -* CI/CD, IDE, 기타 다른 개발 도구를 주기적으로 업데이트해야 한다. -* 모든 시스템에 대한 동시 업데이트를 하지 않아야 한다. 신뢰된 제조사가 침해된 경우를 대비하여 노출을 제한하기 위해 점진적 배포나 카나리 배포를 하여야 한다. - -다음과 같은 변경 사항을 추적하기 위해 변경 관리 프로세스 또는 추적 시스템이 마련되어야 한다. - -* CI/CD 설정 (모든 빌드 도구와 파이프 라인) -* 코드 저장소 -* 샌드박스 영역 -* 개발자 IDE -* 소프트웨어 구성 목록 도구(SBOM tooling)와 생성된 아티팩트 -* 로깅 시스템과 로그 -* 소프트웨어 서비스(Saas) 같은 통합된 외부 서비스 -* 아티팩트 저장소 -* 컨테이너 레지스트리(저장소) - - -다음과 같은 시스템의 경우 보안 강화를 해야하며, 이는 다중 인증(MFA)과 식별 접근 관리(IAM) 잠금을 포함한다. - -* 코드 저장소 (백업, 보호된 브런치, 커밋된 민감 데이터를 포함한다.) -* 개발자 워크스테이션 (주기적 패치, 다중 인증(MFA), 모니터링) -* 빌드 서버와 CI/CD 서버 (직무 분리, 접근 제어, 서명된 빌드, 환경변수 내 민감 데이터, 조작된 증거 로그 등) -* 아티팩트 (무결성 보장을 위해 발신지, 서명, 타임 스탬프를 확인하고, 각각의 환경을 재구축하기 보단 아티팩트를 재배포한다. 또한 빌드가 변경 불가능한지 검증해야 한다.) -* 코드로서의 인프라 (모든 코드 관리, PR 사용과 버전 관리 포함) - -모든 조직은 애플리케이션 생애주기 또는 포트폴리오와 관련된 진행 중인 계획에 대해 모니터링, 분류, 그리고 업데이트 적용 또는 설정 변경에 대해 검증하여야 한다. - - -## 공격 시나리오 예시. - -**시나리오 1:** 신뢰된 제조사는 악성 프로그램(멀웨어)로 침해사고가 발생하였으며, 이는 우리 컴퓨터 시스템이 업그레이드 될 때 침해사고가 발생하는 결과로 이어진다. 유명한 예시는 다음과 같다. - - - -* 2019년 솔러 윈즈 침해사고는 18,000개의 조직 침해사고로 이어졌다.[https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) - -**시나리오 2:** 신뢰된 제조사는 침해사고가 발생하였으며, 이는 특정 조건이 발생하면 동작하도록 되어 있다. - - - -* 2025년에 바이빗은 15억 달러 상당을 탈취당했으며, 사고 이유는 [월렛 소프트웨어에서의 공급망 체인 공격](https://www.sygnia.co/blog/sygnia-investigation-bybit-hack/)으로 알려졌다. 이는 지갑이 사용될 때 악성행위가 동작하도록 설계되었다. - -**시나리오 3:** 2025년에 발생한 [`Shai-Hulud` 공급망 체인 공격](https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem)은 첫번째로 성공한 자기 전파형 npm 웜이다. 공격자는 유명한 패키지에 악성 프로그램 버전을 배포하였으며, 이는 post-install 스크립트를 이용해 민감 정보를 퍼블릭 깃허브 저장소로 유출하거나 탈취하는 역할을 한다. 해당 멀웨어는 피해자 환경 내에서 npm 토큰을 탐지하여 이를 이용해 자동적으로 접근 가능한 패키지의 악성 버전을 푸시한다. 해당 웜은 npm에 의해 차단되기 전 500개가 넘는 패키지 버전에 영향을 미쳤다. 이번 공격망 체인 공격은 사전적이였으며, 빠르게 전파되고 심한 데미지가 있었다. 그리고 개발자가 목표가 됨으로써 개발자 스스로가 공급망 체인 공격을 위한 중요 타깃이 될 수 있다는 것을 증명하였다. - -**시나리오 4:** 컴포넌트는 일반적으로 애플리케이션과 같은 권한으로 동작하여야 한다. 그래서 컴포넌트에 존재하는 취약점은 심각한 영향을 미치는 결과를 낳는다. 해당 취약점은 사고적이거나(예시. 코딩 에러), 고의적일 수 있다(예시. 컴포넌트 내 백도어). 몇개의 발견된 악용 가능한(exploitable) 컴포넌트 취약점은 다음과 같다. - -* CVE-2017-5638, 스트럿츠(Struts)에 2개의 원격 코드 실행 취약점이 발견되었으며, 이는 서버에 임의코드 실행이 가능한 심각한 보안 사고 원인으로 판별되었다. -* CVE-2021-44228 ("Log4Shell"), 아파치 Log4j 라이브러리에서 제로데이 원격코드 실행 취약점이 발견되었으며, 랜섬웨어, 크립토 채굴 그리고 다른 공격에 사용되는 원인으로 판별되었다. - - -## 참조 - -* [OWASP Application Security Verification Standard: V15 Secure Coding and Architecture](https://owasp.org/www-project-application-security-verification-standard/) -* [OWASP Cheat Sheet Series: Dependency Graph SBOM](https://cheatsheetseries.owasp.org/cheatsheets/Dependency_Graph_SBOM_Cheat_Sheet.html) -* [OWASP Cheat Sheet Series: Vulnerable Dependency Management](https://cheatsheetseries.owasp.org/cheatsheets/Vulnerable_Dependency_Management_Cheat_Sheet.html) -* [OWASP Dependency-Track](https://owasp.org/www-project-dependency-track/) -* [OWASP CycloneDX](https://owasp.org/www-project-cyclonedx/) -* [OWASP Application Security Verification Standard: V1 Architecture, design and threat modelling](https://owasp-aasvs.readthedocs.io/en/latest/v1.html) -* [OWASP Dependency Check (for Java and .NET libraries)](https://owasp.org/www-project-dependency-check/) -* OWASP Testing Guide - Map Application Architecture (OTG-INFO-010) -* [OWASP Virtual Patching Best Practices](https://owasp.org/www-community/Virtual_Patching_Best_Practices) -* [The Unfortunate Reality of Insecure Libraries](https://www.scribd.com/document/105692739/JeffWilliamsPreso-Sm) -* [MITRE Common Vulnerabilities and Exposures (CVE) search](https://www.cve.org) -* [National Vulnerability Database (NVD)](https://nvd.nist.gov) -* [Retire.js for detecting known vulnerable JavaScript libraries](https://retirejs.github.io/retire.js/) -* [GitHub Advisory Database](https://github.com/advisories) -* Ruby Libraries Security Advisory Database and Tools -* [SAFECode Software Integrity Controls (PDF)](https://safecode.org/publication/SAFECode_Software_Integrity_Controls0610.pdf) -* [Glassworm supply chain attack](https://thehackernews.com/2025/10/self-spreading-glassworm-infects-vs.html) -* [PhantomRaven supply chain attack campaign](https://thehackernews.com/2025/10/phantomraven-malware-found-in-126-npm.html) - - -## 매핑된 보안 약점(CWE) 목록 - -* [CWE-447 Use of Obsolete Function](https://cwe.mitre.org/data/definitions/447.html) - -* [CWE-1035 2017 Top 10 A9: Using Components with Known Vulnerabilities](https://cwe.mitre.org/data/definitions/1035.html) - -* [CWE-1104 Use of Unmaintained Third Party Components](https://cwe.mitre.org/data/definitions/1104.html) - -* [CWE-1329 Reliance on Component That is Not Updateable](https://cwe.mitre.org/data/definitions/1329.html) - -* [CWE-1357 Reliance on Insufficiently Trustworthy Component](https://cwe.mitre.org/data/definitions/1357.html) - -* [CWE-1395 Dependency on Vulnerable Third-Party Component](https://cwe.mitre.org/data/definitions/1395.html) From 1f7eaa368c859fa76ae71c81626e0c32c4296046 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Tue, 30 Dec 2025 16:19:38 +0900 Subject: [PATCH 032/167] fix some words --- 2025/docs/ko/A02_2025-Security_Misconfiguration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index 2ddf21d74..5ab780db4 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -110,7 +110,7 @@ * [Amazon S3 Bucket Discovery and Enumeration](https://blog.websecurify.com/2017/10/aws-s3-bucket-discovery.html) * ScienceDirect: Security Misconfiguration -## 매핑된 보안 약점(CWE). +## 해당되는 보안 약점(CWE). * [CWE-5 J2EE Misconfiguration: Data Transmission Without Encryption](https://cwe.mitre.org/data/definitions/5.html) From d245baef046c8b607cbb03a1fb6fc249537cc87c Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Tue, 30 Dec 2025 19:40:22 +0900 Subject: [PATCH 033/167] Revise content for application security risks document Updated text for clarity and consistency in the document regarding application security risks, including changes to terminology and formatting. --- ...025-What_are_Application_Security_Risks.md | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index afa2d81c9..e262f45a8 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -1,5 +1,5 @@ # 애플리케이션 보안 위험이란 무엇인가? -공격자는 애플리케이션을 통해 다양한 경로로 비즈니스 또는 조직에 피해를 입힐 수 있다. 이러한 경로들은 조사가 필요한 잠재적 위험을 야기한다. +공격자는 애플리케이션을 통해 다양한 경로로 비즈니스 또는 조직에 피해를 입힐 수 있다. 각 경로는 잠재적 위험을 수반하며, 이를 조사해야 한다. ![Calculation diagram](../assets/2025-algorithm-diagram.png) @@ -36,7 +36,8 @@ - 환경에 따라, 상황에 따라 동적으로 변화 + 환경에 따라, \ +상황에 따라 동적으로 변화 애플리케이션 노출 수준에 따라(환경 기준) @@ -45,7 +46,9 @@ 평균 가중 악용 - 통제 미비를 평균 발생률로 산정하고 적용 범위로 가중 + 통제 누락을 \ +평균 발생률로 산정하고 \ +커버리지로 가중 평균 가중 영향 @@ -56,43 +59,44 @@ -본 위험 등급(Risk Rating)에서는 악용 가능성, 취약점에서 보안 통제가 미비할 평균 가능성, 그리고 기술적 영향을 보편적 파라미터로 고려하였다. -조직은 각기 고유하며, 해당 조직을 대상으로 하는 위협 행위자, 그들의 목표, 그리고 침해 발생 시 영향도 또한 고유하다. 공익 단체가 대외 정보 제공을 위해 콘텐츠 관리 시스템(CMS)을 사용하는 경우와, 보건의료 체계가 동일한 CMS를 민감한 건강 기록에 사용하는 경우를 비교하면, 같은 소프트웨어라 하더라도 위협 행위자와 비즈니스 영향은 크게 달라질 수 있다. 애플리케이션의 노출 수준, 상황별 위협 행위자(비즈니스 및 지역에 따른 표적 공격과 비표적 공격), 그리고 개별 비즈니스 영향을 바탕으로 조직의 위험을 이해하는 것이 중요하다. +본 위험 등급(Risk Rating)은 악용 가능성, 취약점에서 보안 통제가 누락되어 있을 평균 가능성, 그리고 기술적 영향을 공통 평가 요소로 산정에 반영하였다. + +조직은 각기 고유하며, 해당 조직을 대상으로 하는 위협 행위자, 그들의 목표, 그리고 침해 발생 시 영향도 또한 고유하다. 공익 단체가 대외 정보 제공을 위해 콘텐츠 관리 시스템(Contents Management System, CMS)을 사용하는 경우와, 의료 시스템에서 동일한 CMS를 민감한 의료 정보에 사용하는 경우를 비교하면, 같은 소프트웨어라 하더라도 위협 행위자와 비즈니스 영향은 크게 달라질 수 있다. 애플리케이션의 노출 수준, 상황별 위협 행위자(비즈니스 및 지역에 따른 표적 공격과 비표적 공격), 그리고 개별 비즈니스 영향을 바탕으로 조직의 위험을 이해하는 것이 중요하다. ## 범주를 선택하고 순위를 매기기 위해 데이터가 사용되는 방식 2017년에는 발생률(incidence rate)을 기준으로 가능성(likelihood)을 산정하여 범주를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성(Exploitability), 탐지 가능성(Detectability, 가능성에 포함), 기술적 영향(Technical Impact)을 기준으로 순위를 매겼다. 2021년에는 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. -우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE별로 그룹화된 CVSS 악용(Exploit) 점수와 영향(Impact) 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. +우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 악용(Exploit) 점수와 영향(Impact) 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. -CVSSv2에서는 악용(Exploit)과 (기술적) 영향(Impact) 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 악용은 60%, 영향은 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 악용 6.0, 영향 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top Ten 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. +CVSSv2에서는 악용(Exploit)과 (기술적) 영향(Impact) 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 악용은 60%, 영향은 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 악용 6.0, 영향 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. OWASP Dependency-Check에서 추출한 결과, 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)에는 CWE에 매핑된 CVE 레코드가 약 17만 5천 건(2021년의 12만 5천 건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년의 241개에서 증가)이다. 추출된 약 22만 건의 CVE 중 16만 건에는 CVSS v2 점수가, 15만 6천 건에는 CVSS v3 점수가, 6천 건에는 CVSS v4 점수가 있었다. 다수의 CVE가 여러 버전의 점수를 동시에 보유하므로, 점수 건수 합계는 22만 건을 초과한다. Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화한 뒤, 악용 점수와 영향 점수 모두에 대해 CVSSv3 점수를 보유한 비율과 나머지 CVSSv2 점수 보유 비율을 가중치로 적용하여 전체 평균을 산출하였다. 이렇게 산출한 평균을 데이터셋의 CWE에 매핑하여, 위험 방정식의 나머지 절반에 해당하는 악용(Exploit) 및 (기술적) 영향(Technical Impact) 점수로 사용하였다. -왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *악용(Exploit)* 또는 *영향(Impact)* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top Ten 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. +왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *악용(Exploit)* 또는 *영향(Impact)* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. 발생률(incidence rate)은 일정 기간 동안 조직이 테스트한 애플리케이션 모집단에서, 각 CWE에 취약한 애플리케이션의 비율로 산정하였다. 다시 말해, 우리는 빈도(frequency), 즉 한 애플리케이션에서 문제가 몇 번 발견되는지는 사용하지 않는다. 관심 대상은 애플리케이션 모집단 중 각 CWE가 발견된 애플리케이션의 비율이다. -적용 범위(coverage)는 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율로 산정한다. 적용 범위가 높을수록 표본 크기가 모집단을 더 잘 대표하므로, 산정된 발생률이 정확하다는 보증 수준이 더 강해진다. +커버리지(coverage)는 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율로 산정한다. 커버리지가 높을수록 표본 크기가 모집단을 더 잘 대표하므로, 산정된 발생률이 정확하다는 보증 수준이 더 강해진다. -이번 판에서 사용한 공식은 2021년과 유사하되, 일부 가중치가 변경되었다: -(최대 발생률 % * 1000) + (최대 적용 범위 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 +이번 버전에서 사용한 공식은 2021년과 유사하되, 일부 가중치가 변경되었다. +(최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 -산정된 점수는 접근 통제 실패(Broken Access Control) 범주에서 621.60으로 가장 높았고, 메모리 관리 오류(Memory Management Errors) 범주에서 271.08로 가장 낮았다. +산정된 점수는 불충분한 접근 제어(Broken Access Control) 범주에서 621.60으로 가장 높았고, 메모리 관리 오류(Memory Management Errors) 범주에서 271.08로 가장 낮았다. 이는 완벽한 체계는 아니지만, 위험 범주의 순위를 매기는 데 유용하다. -추가로 커지고 있는 과제 중 하나는 “애플리케이션”의 정의이다. 업계가 마이크로서비스와 같이 전통적인 애플리케이션보다 더 작은 구성요소로 이루어진 아키텍처로 전환함에 따라, 산정이 더 어려워지고 있다. 예를 들어 조직이 코드 리포지토리를 테스트하는 경우, 무엇을 애플리케이션으로 간주해야 하는가? CVSSv4의 확산과 마찬가지로, Top Ten의 다음 판에서는 끊임없이 변화하는 산업 환경을 반영하기 위해 분석과 점수 산정을 조정해야 할 수 있다. +추가로 커지고 있는 과제 중 하나는 "애플리케이션"의 정의이다. 업계가 마이크로서비스와 같이 전통적인 애플리케이션보다 더 작은 구성요소로 이루어진 아키텍처로 전환함에 따라, 산정이 더 어려워지고 있다. 예를 들어 조직이 코드 리포지토리를 테스트하는 경우, 무엇을 애플리케이션으로 간주해야 하는가? CVSSv4의 확산과 마찬가지로, Top 10의 다음 판에서는 끊임없이 변화하는 산업 환경을 반영하기 위해 분석과 점수 산정을 조정해야 할 수 있다. -## 데이터 요인 +## 데이터 요소 -Top 10 각 범주에는 다음과 같은 데이터 요인이 제시되며, 의미는 다음과 같다: +Top 10 각 범주에는 다음과 같은 데이터 요소가 제시되며, 의미는 다음과 같다. -**매핑된 CWE(CWEs Mapped):** Top Ten 팀이 해당 범주에 매핑한 CWE의 개수. +**매핑된 CWE(CWEs Mapped):** Top 10 팀이 해당 범주에 매핑한 CWE의 개수. **발생률(Incidence Rate):** 발생률은 해당 연도에 그 조직이 테스트한 모집단에서, 해당 CWE에 취약한 애플리케이션의 비율이다. @@ -100,10 +104,10 @@ Top 10 각 범주에는 다음과 같은 데이터 요인이 제시되며, 의 **가중 영향(Weighted Impact):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향(Impact) 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**(테스트) 적용 범위((Testing) Coverage):** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. +**(테스트) 커버리지((Testing) Coverage):** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. **총 발생 건수(Total Occurrences):** 범주에 매핑된 CWE가 발견된 애플리케이션의 총 개수. **총 CVE(Total CVEs):** 해당 범주에 매핑된 CWE에 매핑된 NVD DB 내 CVE의 총 개수. -**공식(Formula):** (최대 발생률 % * 1000) + (최대 적용 범위 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 +**공식(Formula):** (최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 From 904231642857cf1c9cab58e9db1877cc4ab9a987 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Wed, 31 Dec 2025 12:28:21 +0900 Subject: [PATCH 034/167] Reflect review --- 2025/docs/kr/0x00_2025-Introduction.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/kr/0x00_2025-Introduction.md index dd584d9ab..78b4464b6 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/kr/0x00_2025-Introduction.md @@ -52,14 +52,14 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! 이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트 된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE의 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 이번 버전에서도 CWE의 발생 빈도를 분석에서 제외한다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 퍼져있는 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경이 불가피하였다. -CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. Root Cause 유형에는 "Cryptographic Failure", "Misconfiguration" 등이 있고, Symptom 유형에는 "Sensitive Data Exposure", "Denial of Service" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 Root Cause에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. Symptom보다 Root Cause에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 Symptom과 Root Cause가 혼재되어 있었다. CWE 자체도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-Software Supply Chain Failures, A09:2025-Security Logging and Alerting Failures)에서 최대 40개(A01:2025-Broken Access Control)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. +CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. 근본 원인의 유형에는 "Cryptographic Failure", "Misconfiguration" 등이 있고, 증상 유형에는 "Sensitive Data Exposure", "Denial of Service" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근분 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-Software Supply Chain Failures, A09:2025-Security Logging and Alerting Failures)에서 최대 40개(A01:2025-Broken Access Control)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. -MITRE Top 25 Most Dangerous Software Weaknesses와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다. 첫째, 모든 CWE가 모든 프로그래밍 언어나 프레임워크에 존재하는 것은 아니다. 이로 인해 Top 10의 일부가 적용되지 않는 경우 도구 및 교육/인식 프로그램에 문제가 발생한다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 Injection, Command Injection, Cross-site Scripting, Hardcoded Passwords, Lack of Validation, Buffer Overflows, Cleartext Storage of Sensitive Information 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. +MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다.모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않는 경우 도구, 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 Injection, Command Injection, Cross-site Scripting, Hardcoded Passwords, Lack of Validation, Buffer Overflows, Cleartext Storage of Sensitive Information 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. ## 카테고리 선정을 위한 데이터 사용법 -2021년 버전과 마찬가지로 *Exploitability* 및 *(Technical) Impact*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. +2021년 버전과 마찬가지로 *악용가능성(Exploitability)* 및 *기술적 영향도((Technical) Impact)*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. CVSSv2에서는 Exploit과 (Technical) Impact 모두 최대 10.0까지 가능하였으나, 공식에 따라 Exploit은 60%, Impact는 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 Exploit 6.0, Impact 4.0으로 제한되었다. 가중치를 고려한 결과, Impact 점수는 CVSSv3에서 평균적으로 약 1.5점 상승하였고, Exploitability는 평균적으로 약 0.5점 하락하였다. From 8bf964091d9610914f423288d278d15f792f6c4d Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Wed, 31 Dec 2025 16:20:58 +0900 Subject: [PATCH 035/167] Update image path and refine text in document --- ...2_2025-What_are_Application_Security_Risks.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index e262f45a8..7550cfbe7 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -1,7 +1,7 @@ # 애플리케이션 보안 위험이란 무엇인가? 공격자는 애플리케이션을 통해 다양한 경로로 비즈니스 또는 조직에 피해를 입힐 수 있다. 각 경로는 잠재적 위험을 수반하며, 이를 조사해야 한다. -![Calculation diagram](../assets/2025-algorithm-diagram.png) +![Calculation diagram](../ko/assets/2025-algorithm-diagram.png) @@ -69,17 +69,17 @@ 2017년에는 발생률(incidence rate)을 기준으로 가능성(likelihood)을 산정하여 범주를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성(Exploitability), 탐지 가능성(Detectability, 가능성에 포함), 기술적 영향(Technical Impact)을 기준으로 순위를 매겼다. 2021년에는 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. -우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 악용(Exploit) 점수와 영향(Impact) 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. +우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 악용(Exploit) 점수와 영향 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. -CVSSv2에서는 악용(Exploit)과 (기술적) 영향(Impact) 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 악용은 60%, 영향은 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 악용 6.0, 영향 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. +CVSSv2에서는 악용과 (기술적) 영향 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 악용은 60%, 영향은 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 악용 6.0, 영향 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. OWASP Dependency-Check에서 추출한 결과, 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)에는 CWE에 매핑된 CVE 레코드가 약 17만 5천 건(2021년의 12만 5천 건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년의 241개에서 증가)이다. 추출된 약 22만 건의 CVE 중 16만 건에는 CVSS v2 점수가, 15만 6천 건에는 CVSS v3 점수가, 6천 건에는 CVSS v4 점수가 있었다. 다수의 CVE가 여러 버전의 점수를 동시에 보유하므로, 점수 건수 합계는 22만 건을 초과한다. -Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화한 뒤, 악용 점수와 영향 점수 모두에 대해 CVSSv3 점수를 보유한 비율과 나머지 CVSSv2 점수 보유 비율을 가중치로 적용하여 전체 평균을 산출하였다. 이렇게 산출한 평균을 데이터셋의 CWE에 매핑하여, 위험 방정식의 나머지 절반에 해당하는 악용(Exploit) 및 (기술적) 영향(Technical Impact) 점수로 사용하였다. +Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화한 뒤, 악용 점수와 영향 점수 모두에 대해 CVSSv3 점수를 보유한 비율과 나머지 CVSSv2 점수 보유 비율을 가중치로 적용하여 전체 평균을 산출하였다. 이렇게 산출한 평균을 데이터셋의 CWE에 매핑하여, 위험 방정식의 나머지 절반에 해당하는 악용 및 기술적 영향 점수로 사용하였다. -왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *악용(Exploit)* 또는 *영향(Impact)* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. +왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *악용* 또는 *영향* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. -발생률(incidence rate)은 일정 기간 동안 조직이 테스트한 애플리케이션 모집단에서, 각 CWE에 취약한 애플리케이션의 비율로 산정하였다. 다시 말해, 우리는 빈도(frequency), 즉 한 애플리케이션에서 문제가 몇 번 발견되는지는 사용하지 않는다. 관심 대상은 애플리케이션 모집단 중 각 CWE가 발견된 애플리케이션의 비율이다. +발생률은 일정 기간 동안 조직이 테스트한 애플리케이션 모집단에서, 각 CWE에 취약한 애플리케이션의 비율로 산정하였다. 다시 말해, 우리는 빈도(frequency), 즉 한 애플리케이션에서 문제가 몇 번 발견되는지는 사용하지 않는다. 관심 대상은 애플리케이션 모집단 중 각 CWE가 발견된 애플리케이션의 비율이다. 커버리지(coverage)는 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율로 산정한다. 커버리지가 높을수록 표본 크기가 모집단을 더 잘 대표하므로, 산정된 발생률이 정확하다는 보증 수준이 더 강해진다. @@ -100,9 +100,9 @@ Top 10 각 범주에는 다음과 같은 데이터 요소가 제시되며, 의 **발생률(Incidence Rate):** 발생률은 해당 연도에 그 조직이 테스트한 모집단에서, 해당 CWE에 취약한 애플리케이션의 비율이다. -**가중 악용(Weighted Exploit):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 악용(Exploit) 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. +**가중 악용(Weighted Exploit):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 악용 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**가중 영향(Weighted Impact):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향(Impact) 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. +**가중 영향(Weighted Impact):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. **(테스트) 커버리지((Testing) Coverage):** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. From f97a03f84524f71d747c8a2aeeb286d36078e83a Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Wed, 31 Dec 2025 16:25:13 +0900 Subject: [PATCH 036/167] Upload Calculation diagram_ko.png MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사진 한국어 버전 업로드 O-SQZ(Juhyeong Kim)님의 기여에 감사드립니다. --- 2025/docs/ko/assets/Calculation diagram_ko.png | Bin 0 -> 49551 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 2025/docs/ko/assets/Calculation diagram_ko.png diff --git a/2025/docs/ko/assets/Calculation diagram_ko.png b/2025/docs/ko/assets/Calculation diagram_ko.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a07af288a39e53e46f102c3ef6335408e42b59 GIT binary patch literal 49551 zcmc$FgA zvbyW?oadRj=bo8+!W87hQ4sMFK_C!{q=bkP2m~Dtyxv5B2mTz9+5HLpc<&&g=?nrP zVZPl^ptKA;5U5u`QskS8d&Y65M~15D^YF%$<|#iC6LPt~Ke1G-MXPkqj-HuSNou=V zPU5!IG~H$f~jJcIf6Ea$8ZBJ)(Qv(=AgAw2!a z8MjBShNoP6Szf2kS(m)odyn4T8{!hw6#V~pc~G@KKzsl1@}%rixH|vuMIFkB<@3LH z5I2!TiT-f|0{Gs; z!^6Dn`tqz8p}o^+FS^x|y+m5|i>J#eWo>O~4-c;53@1b~@#uyR7|{M-t>-}wPv^rh zH7*BAAb4avK{ovBXj&`@U0vOYF~;uk;%r~U9zCy1!Cy<*O&QP z=tV`VUbS62{Mq_41tP~2H8do~|9D)F^C&0q?Bb7eJKvdYJREJ>7xbR@cGWo{A%V%^ zkDyo-{$O7)l4iFrpYz^iVQp<(Sy>s*Ui6@mikcb@Z}(J{>B(|q$Mek!T=vY9mp-r# zzt=~7P&DTzLf#COfj~E|t_wP?T7?1dz3Y2xLr1CRS$`v0Ck@Uw2QwV{-h<#);@%#3 zH{BkZ$#fL!%yadUQLiKA;o%{mdrMmX0Rxj#W*_^yoOaB6XEaeJgR^$x%xg4yfFCgcOrq$sZLK-yR9Wt;9>a;su(jJ6cqZU&7OUS>J*R<1vgt#a z;Pq5xv0#Ts+UDocuI#0Tx%mchNWcMj*sinomeZn({M-sg@WwC6!+P|-^ zhbm_;vgz!Ve>!z*je>RR&7#0lI%*XfBv7pme}$+Eea?UnQZ7_zZrNt@c{Rayc%{Ck z0lyR6HGddARb>e5EZ3A9`_irNdWQ$st;=`{vtIjO{@YWp*GrsUJvWf^o@YW`RchGSnWnP=0x>#y<~-5f8igDW)ai?l}z zzx-)Ryss`RqoFqa`;h39Z8nvaSwGcDL|9oLob|)wa@XV5LENX&>ve644=^uX4XbvX z=8ch4^HqM!iL|d=k83A9H0?rr^?PCAa+2qa34E$kB%eLG zJrYk%Pd~wR+Parz+#3J~JahU-RNovA zK77H6IC=VTG??K!ulaVbKWf`|CeD?sH`ma#&gc9f@=d|j_l^UOOi@j3=*@TPOvgBn zD(ZP7a$V@;>@s!RT&Mx)v1y#_x>>ef=WBg9EH5o9+q~O~F$cDqK3ccKof&l2afu4j zzw5&V;jx$?l&e)j8vt*D_?Ac4bu+;09vN=Smg|oYd4WveSJxX2hUfVVN3+R_pPpG3 zXYQ^+>{^GFq^8ogqoZ}oV|frst;yxHJawCFG$Z0<*q0Eyz6R?`WSY|+9YBiD8c1&} zn;00hn`ESxcsD1S`CC?WY5M^;(`uw@Q`>*?RQ#2fB2YG2q_B3rysI_vzByer)5cNqd@CInM8dFSUx!`PL(o-=|Hd!`-o0 z{f5t>dazNb#Qv+6q8n#sfp4%}iEXgX`IvSKJz- z`9eN$M((#PkGxB_-r)YqdgWrdMC|e6IS%9xH1f2Sw zJK^HO3B(T=G0vk-_OQ>*((sBJfWVO-Sv6`5pe}bOi~$6o)2Q(WObl!7z(szmev03C zCQmeraq}%oTpd6@B?7@zNL-)2xRCl9IY;8Cb4-cMZ z<0-Yn+F13DV~^$f&sGsW8;|R^?m)z71&las&?w852`A#skuQ$xr=0pxIBJ}Bq~0*& z<>3gbeNxY5MzjO?qz-@`0PN(6W)gDP5%}LCtEj7AUP0txn1JoiaJvE`wE6yYuHJJt znF;`OPoZ_5WB z^=%{P`v9|M1)r|soal<5GP<1c&G%$w0ho^>&wo$e*x2|V=k>lA5y_v)AYw5a$15u@ z=llLnK~r<&>Had62W;2NcsB{|>hHW=A9EZg9PaSA*O~6VZ#qxXMv{nC#^HzERpgBw}%+;(AI3K`Vzv=RM zbh@5XXLZ_^IPJXEQ>)gS04$~zz}6N33BY#-Yo14ydV^IJ6(*wz)Rmvx9k+&XU_y?+ z1;|fr0S<4AuDHjoRjuEh1^9%+s^jn*MmO25jRLVYh2Mu8i0uEOor}Nsx`AFN?0sR_ z-pRj##VUBi2Vh3*<}_!E#xbUV`HyFCLDGewG+G>T_xd*L9Jj>uyw62(81=>hJmtC^ zXXOIy=*>G8^!^T&6cartZF1AM^3AkAH zJ|B+&Ya#^cIE_%y-()%teLUeF{#~jJ)p2m3EXNhR6(f+<|3M%F07yq*(;7sNWc>x8``CSZ%Ix*n`RZ~Fwe zWb5s^SLC#xoL^daoA^M0doQ}(upze`u$ zx1s?0auLkv{XP5Ts+gVzY-&mo!~Z~q`9+Ryahey1OIiEcfPuUn{!eKJLx7xRZERgH z=%2Y#0tkK~YQ$4oU2RV?4saj%hK7F(0EPhJ@4S8EdGgXSL%^?VFaJ{(cO?wc5fd3D{R?kJ5Ky= zi|F+i^DqIVbfc4&+AUS!Uk}W>0Ymoj$&|qB+k?e$TbP%9u6xr z?Wb)K0IOb2r-yE5oce6=e39I}dXk^jJ5PLiMrV>zQdMO(TOe7X*O^wTT)cbr9pJft ziqh>at`wT$Y{W(K7415&)k07SM^QLdV=;f6|00WVI4mu`fMmZU0I_)PD0#)pFW2j= z_6?qP0zdF0EW+KqA*1awTQt`$o|LpS7w~+YNO4M@)C8++C`&D5^a~jKoAAReQ1l?b zr!AsXE@!j!zbl<2g`)O`0KxGF;Bq}d$dSU)~i|RH$W_$ebzBH&QEsg>0aQAczR6B#z0Dg7_}-p-ovyAm1?cp-UA^e zL^7VzaouCj5pWtPcWUA+kKNRO1r2?Dd0pMicp$izMOHX1B31L08s+K(PF=nlA+$7a}<767rq z*17vdE^kcOoC|C|GGC$D?+*pj@m%$&YyCYNFgg<;ED<;kpbr=^zb)am>z1#_?#Fz! z{**Y8&p;H%dP;sW5D2tn^W%Lo?}q_)-!|+z#y9DvVMEUcqlucZWVmoYIeicHf#JTF z`F=8~@*AyOEq+a?eSFcR!!O8@vUqKlj6tAC;Nl zAg5y5&vM$mbeUYmk94NZ>Y0U|w+nntJg2p4f;>$~3)z+Qt8vFowk!U-2JpA`H9qiw z6%y@EW~Q?yrbaz}Oa@NxQL<%arp&Vw*aAGdyX=&fn=jtINwTM;(FKPvAVx zoTXpv)ipb-L@A%uG2He8I8k=H)f86QReXSjpWGo)(i_j_E)a2lo76W3H#-GM{0TklBiN9Cyy z9p03SKP?5q+UywfsveM&t&v)XO1u5}X1=V$5g$q`w0hYI>@)yX%jFylfcqHz>G@7y z7Rm0_#rQh%{$eo@r(+gY12JL|0ypgl3M zyL-Bfp4r;G1gvWF2{=~5#&?ynCk@4&mJv^u^L(YYhcc;q)%!o6t!#rUY=Fhk;{qxD zuqS_0ZXJx+O_C;#R z=XO#1sFl8ML3$kA!Z47v{bx1ZVWAb)D`7V7F`?VcOuVa_FZ*Ep-p3REq?X-v03Wj6 z7Tal8o<3?VZ<)@my=(W;R2zTw!kY1Z=M)tNS{?#vn1QN~GU_w@B`i>}bj@P9A!DdD9#+&^3Yy&$aT!Fe(Nz2v`n=kEXS z9c46qs)xJ(URVRT;r~~Cg8TpdUu@O&{r|V*;u^YGCv|<%Gf^o8RkXZ0;h+TH_m6kS za(D7B=a%^>YnE<59_JEwwzlfY+yccdlI!w^7n*@5I~J3mM)$2=EB|Mo93%fF7K0iV zpwI4q;ds**PMIzag~+$B(1jM_zGO$@F+-D>_QIF$3(cIBcze4M3L#ioZL)nWKo5T< zzzGx-Ec7$QQ&n9&Uu=I~BuqD1nI}JYhyQlg5V_wbB>IYwrnY)7SM}1yUHPhkgBKFKDbEM~Y;HhFp`nB! zPfj%wG|kpYb^5hRL53V7r6|}`>d~+Kb|ORa{fJ0_%zt)LwqT%+PAL@`svkrWD|FTN zZJuF}o|S|N83w`@m!$e{S`JB6{fS<;Ex~z;FPUDui8$yVewg3$k^ZXdg6`8zbN5by zvRp5ltcw0Y^QW<&CM=dprC4c2Xox&G+TQ(n2^gx%(=arpD&Zn5l2j$`$}{|3uCB!+ z4E*m8T=4suYUm`HhdPv&VR~I?f)n~4yVgBdW)C8j`MVT*ijU$JVK^amHei&oI(m~% z$AZRkCfTVn3r(CPOQXikhgs^}eRlZj?icQjhxuj+a*Pa@SxF!n4+Mf@I?5;Z8iQWw zEbj}+H#Yuq9^>~fvD$kOH{xW#)rkW+P=zK~WVkNP{!f;jW&%c#WwH==CS{@w`m}KS zU75F=IUS_$C(fYfgH5gl$Fx$})y?1RqvZ7n9XcOR9+ok%!0S%Eaowo&CM;>QlSOe* z9*((lE43f(K)=jLyUarEC&+Uo6_6?=1l1_4<+va0H{Wtf|hCQgy1 zQ3^boAVT*`JHiI`T2p*o$?f6F|7|4l)dMD zLA>05imgMDAD%;|Ow>TSYeux zf)T%s<-T7t6v%jZa4G`I9ys?WLfzp^sga_T#`m@rF){LI{kY+TU$m)CbH=&(K2%U4 z7Fjw026PGRzY|clRa8{$ov+lUW@OxZOKSlVZUC$yrD&;^+MMId&z1Z}=g&T1VW}Qy z5(?4r>y;gw#hPf8PxG!Tx006fJjF`Xu}lUA2^ah%{0}u*AJlBg;w1wYAr~Euugzs; zIeC69b4^C#J2)}JOErds=kC1bUgC$}toJM;POHq@$?QDZch0sT)-~jPY$xa4rr!;Z zA1rnD8r`FeNiFRzP!-qB79m!XY1>f?kW>L>8HNx;13dWfJOj<7z4n&C_?1_#d2#A*C05R+i^|>v^a{|> zebA|DXy|aM4Ly1LNwuow>pMVi#O5*uQ;stjsHDLBn_sb4XuQ9~8P0IuNN{JHe4CwmW+$4Kh@4te*Ol<+D7G|OZvHPuJW zpBMq(5`CYAY?glh(j?PDfD?rqv*A*379EmivV)ZITR1=zfXsaJX?Z^?6ZOc?vV{@Ier@|G!o+&brcJP`;TGt(J~&Fyd5 zO&hyg7^Cg*n#I>MdOW7tMYi&qu$V6f8>gYYHx%nj35PF3ouT?YxBS?a8>QcBhGOsg z4+^A=%IO~$_|EH5EYpV_bPcIF#>W5L06xyc)%%mjb80Z?bIWY_ zyM&?J?!y9TK~;!Z`(G;;=34jn3~DnDAGvl1nH)7`j7xPSh1UmI(xo6SJ5n8IibJR^ z^jYYc2_wbjLm8==&GJi3BP3BQ({2Qsf(0|QF_xgCPa}~H3b!$&eTXLEpS-8B>^I|G ztr1VlOPBh95<(x~pJ(p}-w{2bNGI{mY%a!;-ICx(F&hn7%vV0PxZ^G&Dg~HIu~Eu~acncOV^R`au?-HAu|MK`R;4X=-;PF6HyqDy( zY7FL^L6SPo6Q*3lZP$mp>1Q{GM#&^6=F?egu{qyEspto{CNl&Ih=rQ|U_im4E5*Jq z7vAGPC{X6w45fyo8iva9R# z-gL&|^t%!Zz)Va}`#Z8o|H{ZCe!fv)M;&B+Si3{@dH8UmBWbWYzFSCPCp2{QQ?$_MGG zWezQ=2C$j|-#uRHmuw+EUz)shx(GYfB%yB#Ep~fI-I?oW8XZ>I8$(H=s#KQW6uwG4 zb3|W=@#Wg9lhRz}g%1Xz@}>ZH%b%{|>=z_}2_V*Lgf*YcYvVW^(IbIEhtoOtrQHtm z2{k#xLqO#FZN%s?wU+sUp~yw0mHt@q#DJ=tI_Y*I0 z%mT?1EkB*7IuqPG!nExlxgh2l!$8FOOL+VHXE)HrB`)%LY|mQEaNCvaczK|GddS*f zwOe&p1Kblpos%}GFj#2ltw7EpZIpz$0!1U7^Zu;_??RWoqexg$b&0Oz9(R6GO%%Ms zxll$i#V-Rr7Tv0LBR{_&qAr78t}hUKa3VQ2ygAM~n`hhK35TGP;fLWotwvYt3n>^> zNypvG^HHc;iY$`*N@V<`7NsJ}Uc*(rwwcVV7}6pju5&q!o#RNzbNv(Djw;w+<^21^~E-BcCZjmh%`y|HniH#na2tzx~Q^xgon z-9Q$zjYK8}`Zu}U2=X@EmH>sQsMJ{X!-LG$!9<{o*1fjvHtlKbUb>~sL!k3C1oR~k ze)Q{++Jf=%4S-hMDnMY?uafhq$m1m`y@CE64;y^=rT|woP zQ5|qDH`w>Cli8G$`h!yAs(Pm^{ew?Ds3U6i1(%66S<>kBGe!5My&$jFJ5+}4ixmx` z6F;pg3VisaByu-{UZ_aK3C!u5=#~N!Yy5s-sO*D<{C?N8>(`k|Ha6?;BPJH361Vby zyC&iwVS^)GOd5|3Xk?Z>tk!;?DUdS;&ARUSi1OL{9|zD~yXD;P3A_h-5&mXJu#1pz z2EPZ0Jygs6ZhI=HAqHsUwYOE*PO*Vb(o!>4Lz39sEB8FmP$GaNsxu_9rjWb$HEDs# z$%Pu`ooJjA)YDT0gOK2BI8!=%s)>?iz>JavuARf0c9h)296)u5V@r>UcO5_{d@By?`n~AZ@gJ&8_6O zf{4K;`_1nA@`vVJ8+7C}_JTq4f`)f?c^;UgUV#yCR0_9R^xCJ@LK->N(ALfw+mDV{ zvX)oXiDct9suJoMxOsVb82&(Te6!yy-v>tCtLbL~muZr>;PT_?n==AU${Bl{RtH>a zl0}=KRzTZ_W-|UCy?ZE)e(f#5vmOx7rEMdEy3K?H! zL{Af(`3ilsKz7*ly@-qZTR>HQweOFC{s_Z|;C)#~5nR~mDy?Qze@Ha%PYdFnUr;bD zS3#I5_dPIlo#$d=sQ5vgFYaexc|7KTp(4u3?q@eO`*q}=le`+zuMMxc+w5)cgokc>uA6yO5$H*5T2SrG*7C0jjc^T1b0UeIC`omgDHym^NQA z?5uy&z^Mz3zfA>%j5LI?>pLa*_(rC#}{ zv}7}VeZCSPnXphQjcm$V_9BIlAH=#(Phiz_0dv6VIbT|;VVKCe4j=$7lfoUbt8<{>pnZ)v^;rqm+fQ88=ndak{ z1g1Y%-{_xfpZDs)q!a*r3cM0rKV71K{W{TS|BlGkwHxhbj9CsUOHX0lH*mWNq5wlv zrurnsYFFI}a(_8#PGvHJooj65eIEJ*8h<#kcmCkUHhtf`F*zNMn6&N?=(8I5!D;n) zN#*%KUa!~{LKagq^`}?I@3d94dpE!(SYbR%&K(dTG0Q?$%<$lWe(`uFPcqQVWHKH? zwre|}1gw~kNR-<2C~iv0NK%qJQAn2EedQu1Eo@^a4wQPQ(^U#umF`gHN;J>Uu?} zCI}ZN|6M`+{sw+nzg%zc3YX4)PH*n)sL0TNeLxLCCLDSrug+8Sf8{^CM!O#I@4ki2 zW$UWFqVzqNwymX)-1xt2@P2C02~rg(>SFI@zS^2@^A{#0{~)a0zZC<0_YVNrOxqR zdRn7`rejhY22)|>&)@-ZxcPSddT)GvSL;r9-OHW=RNY-0DU8aWVdxe0s}=WTa5+|J z9v=;>>9q*_Ow1NMJ})D8pAtoR{vll21X^!I8jrr4e?$;+Y1b^0cl6bJDuSVvQ+((}>nAu-{YA7@a3 zYQcOY)5&eY6&3dQ9Un$m18s^Zbdu#yA%p09=-%dap|Y}*h)`W>Divm`ECw6f?)KjC zlmY8>r}>H`jB$9F{B?`<*tuFM>XT>Jk7&@ABddR~--op8qf>oE%0+}ugenN*gUix4 zSNXo5&$D~?6mi0d5`{t!ttrQSpyD3@#ULvim4$tNvvPLs{b^6nkH@*Xo6sNKEBWLp z*cDx9@jF9W5tF+_!gV%V?adbVki5!Fqdy}SVUvxdK?+8pC|rXkkU+_C?I24TQ2=e& zH#3DYczyozZ)pgnLhITtVrsnm5uD+>yi}q03`J2`sCVVW4)J4xM0n~opKfLRTDu3o zMt48$OaaX*_3%eyz6|rx8pPY(Nq_m0R#y=V=v<@*mZ)A_R0<}h&?S>Rv6EDo+?9Gb zDT(u-0y>R~stcR;zj{}D0`BvR-gV904~Npnd`4KT<}V3pY4mR)6R6Fm0RWXvr04rJ zPNG3sC@wPoI!^&6L6`s3PBo{kTOfb=8`BbzBCM5!>y7l;WmTc#duk2G_(fbPJSJNO z$AGYK5nrPA{@r|k4k7iKG0YyrN?knvmcJXixFOs7lY`x6v}gw zK*<9{GnyzIWH(8VsaJrx9F^p|Klgv2ju5+_<$q){JnQUyb|&)q{n9_f1O`%q$W1 z%5JG_<;U-+N?LBqvHpEM_3*}pnbbG_f?;frB2;aCJ*@RNN6=rbyAcq){6^Q$+&E2t z+!`J^f7N)8gpQTfU0}mBjT)MZjEY5{V!GVieIzSy3lu5<5l4!cc{mLYts!6lyBgl0 zb}pU-Ow^28q+#gX+%-mJU}C*!V-l)vz**#$zlH3L>|_XIWMJE zXYi@cXy*b)al}BJG6sN`!@~*so53wd{7;|oco%QZwcBsV=Bu86tq2^oeF_shLB9vm zc8yy}!g96Fu{?p-UY??Yh6HTdlp*Fa=QO2BvW=&)~% z1`MNq`0H@mafDOVx%=RTBg0_iZzmpPe(wg8?9jKowN}i z##n>-WC2BOMsmX9S^XHz-fCZ}DYjfq&2x7i6#^U&d9%XX?adX_Y4oV%XE=b6wB}9*^LTY$ z)F1P_iL3cCre9}vX~u55GL+Nh6BaC_V!tM3Nj1v;LC8sQk|Kbhc{ zqaDR@IoEi3Sy@*(#7v=WZ6w`q%W6T+Gl!|5SqxJRv}=F7A?xeVl4aiVnl<8^K@1wX zx_5GY=P~rpPF#Oy6oY7LFpAb{XLLBEyLH6eRq%3`g;c5$6rQ)un)q~$+lx4dM?7I% zRq#%bJRs^GZzVCV^8x!h!+!28FT3}&YF!iUXUmY$tzmhC%^(<{F&*FG9eTSVuo2<* znZu6vEkj+8gNsB28hUS0O5*V!s4mKS|yJP6=1G$yQ!q!6U>q-kuU) z>E1{vVWtPac6mHz_BKqzhFe>*nIK7u#>M&kTh>#hUFHsCOV7sIA^0f`XayAwe>R>us@}^mmocT_$nasu3_&^KwDCkr+iqu@O2EkDYbC^O^fmG6EZx>qT<&S;`MWiiMD4m3AAuq@VFz z7|c-7`A9L#CJ75Ia#6L$LXjGR%u=?KQA2w{B_)lKt|IjcMVYQ&P149Gn9aLReYjm87D|ih$$eJhFDPDyDn|85a7!Cq-IOe%a_}dr6sM*`|4Nr$dW~fl<^r zi2+PfK(D&tmg%=xgWmDFUIci8=RE%X%=EM<11dBVc`xQ82`S>xYZ|fXcf>d{V`P47 z1kcng*5^_&Rr@rqcf|yaN)tDtlX*_df--Xj=Nl+)SlKkwl!<7ZU5xuu^=JCDZx!l% zN_mrk(3uRM`FlNv!H@^fm#cqgE$6uP9otLd1m}qvz3V_yko;5Q{W~IWk@CQP_K06W zJ?f8(FB$e6%ScdEXlYnx)8G&^e6&&e>`*E9Gid(g%Ht_J%tBLb;tBCZyl4a^A z4iI|<{Vgo1eNbR3I}(b7QTt#=V+YtWB_!YXDj>*0+6t7Dl}J$n#bkxIc?yLt1AZ)B zS1o#AWuDb4;aG(Q5LCxmh324!5i6@D-|e+{oUwbiMFWyPPlzAD25s(K2thL)tL}E; z@j@;?Bvi0^Z)~ZXY%9fo4&9KU4H!`%6A+B?;A}cZRBCV9RIdmQEy~d0HhN)WOQC43P8foZdGpb{2*k_KUe6IM%(PCyq=E z8R1y81D!csF;nKor#mhEhCu1kmzpex4bDW&$DCmo#@ zEQX)OmwN+ZF_|=Ej)}G6mro>{?B!>Er;sGp1+ssYCBge0Isly&EH{T`j^DDRJ2>wc zJ*Cst;*9zW$BW0SGn`aG6$)zDm`&Ry+>B9)*1C-+zDc4Gd6rsR#BMFEkBv@66)oB# zApw4Wfl-7_O(fek^*V)fPX&g?^!Y(aZ6?{j>db+Ccn-73@}~s(bh8Z!t2a~X1(j7c z28~pHLIETpNGM1ZTUJV&%1zNr?Q;_f$JFa>w?Ud)EaJZ#K$HV0_m-2pGk6k@bzXDo zSm2Wq&`^S%lD^p4SS^25o;s;90t7w@N_j`zKqJ2Uc|y*%-ed&hO_&L2@>Vi`Ybav5 z=zhTnBMu_QLsd?aA*Dy6Mu9ZPV&-Tc$!{r3{GJRupiPXshz=~Dx%e6|%?R5%wVVmHGA$iFnesM*WAO!R< zf&}A_u}XD5>5{S&?D+T#c_r^3Zcd~%HMw?n+`@|`$OEd5+JhxvS6*4-Ycn>KH3n0P zMA^!`w3}>Ye@dm6lN~V@4o?}o z$5f?*H;HLq03IHUst6Iv>D*pnOI1Rm zKH)F5eKj?w58qEn2*E>}LEy}r_DL(4I}W5OBqUfcVy8cAc3HdTc#Y#5q+b(QJ#wsU zE)$Hf5Xoz*9mH+|nu{!k)4vmP&7^-$aj>H!mLq?}2ec$XX0#)6vF2Q=fi!U%K^k;o zoOmL0Y}EvpM|w9d4W^nw!X#M4pOG)S74um5$+0TOJZK z<9}k>uIym(IaJy8KGNpuJDVYTO(6nm!7?4YX&J`DS7%dwNDO~!X7bzhsoau9XReRh z03F!fl;4XmF`5A|qND?eh3SA98ew1k@H{kRctzDj1Ex^RGzn@&z#<{jY?Wh`{FFJg zh-&ixR5AUbm1>hwk4dw2a=1#~N~eHk7}^anny~UwE3|Nmj`m`%F@zj#`hAepj0z#- z7b3Y5abn$~TD;lH&6Gp|I~wXyLh^@#j*dt`4QEt~M=~t5W_4Jk7rF_%z4+}reKxkX zAV>4Et1C4={w$T$uqf#wOq7uHjcdVY0=IodIv+F52=C0LuGqD3^KhuRUOPMjztX(Q z{Vmwhu*e4bu-@oQK&x-=aI=J~psaktR}TVeZZ>mH>9(fO9S8eBEAXu=sG_3M^xFL1 zT#A$Iq(<#qy?`}ynnhT0{!Bd^&N*|VXjnlN`$*YsQ~ofx$r$%AX)On^3*WooC9Dvhajk}BtC%VNjtkuUW{ zWgavB-%U-kx{aC?GMQYc7{}8@U3Cf5kJ47g6k*`eP~h7a1ZFy$sv4m5S=v9>u}GPcc>=u%^>q2@#& zgF6Ez5&FH`yb1L{$1|o>Sfpx7--yx3*G-D4F`y5RWSi_PbEVjC0=f&4_f75;Dp-4p|#puTA<4@vC6&O4heMU z3=p;C3~|w^DMI3Qx8@oXuHV-$)L_hhFdO2a^Yn7+HK4^HcI3X z?aES=F#}UNG1D$9Uq* z??JJ%vjdD{DJdxlQDF%!Tr;>D?vJ#<{E`{U%O#Ob=Ina7bHN!FZ#d|uEc<*h~mCky8%u+|zsk8Si7-f-$fEh^NMD;Gr|A(Yp&~wKLz{dOzewOct9$>hJ>bb2H~Oo# zYX;4U0dD-m1DoqgJfO@fTlVpxNfc7Oo}4<~IY6g1J$dRwKaJTJGzf_av{rN(t3c^p z1msK)gnHmL*N%%(+T-R8-#3jFD2u`Ym>hZ=>wMZ1czx3nnE)L!-z@IzP12JRN1mk$ zG0qBQB|T|nWtcb%eWTixW=aoE0x>Y@5zuXReFj0PZ`yVpOwXvNY#qnwOKR@M#6SsOkr53cpN2Q7JRU`b2L z#MZvct-pqeg)%JYTL-l;i)HMHMoBm^#vC<0l0qlfH%h``HWWH(r3QwMl!+Q!QoCD~ zvJbjE*T)Z^-bSO|Mm%7lp-$V+_<^8#B+HmyBnb$N06`0p{{5(W3otPJHZQ}um*Kp8 zQVl4Fe1mX7s%khS1oJa&Q5I}cz**rTdn!)=D!WeDFhWAR(F|o@2o>v+VrB}Dr?xl-ZdJ5yqKvh|MYwo7WUC~ zXR)OSG?U7GrE%VH7TU^43W_Al<}bN5nW1e29kBDMk(mSB@wE~*95pgLR$AQA;4;?s z+--^#wXYQN66}m)UouSZJM#Q5 zR)}p?Xio@4KHDby8(Hz>p17y>x@~D;`sB74>nNTeitv22 zNGGyvRv5pLepjGw6Y?s5IR-f{h45o z-Rp6|pFZjF6Na$8mk=An#ZBw*Ok|cR#4=db>F@-(k!;U(=2Hnl)wmfd()jNWo+XuQ zh6(QN!Ffmecfh36`P<|NFxYwuC`Z@@wzN?E?tzMu_q`J^s`vHfZdkwxK$(Y^aDGuy zDpK>otSY%eKne#LZ1KR-h2_yXu=>(fcJgeCz^jT`LRHByvM>u~2CL%mWEvYYG;J8oZDXO$e%B^?+u zW%mttPmvA>Si|0a4q=qKZuU^XFgBW!?fXfiPf+bxGh$}{Zf0$kuj#{i`s#@Bg1Voh zPO^Qayay0MY}Q8K2|S>e#><;o@S@t~{p01vR(%^o^O~&V!SF6CBQ4x6$&WSyrnoZi zxwA$bM%xV;`QGdDK7H%q=m4ead;tuSkC7QYp~!G zwQj}}-YV3(;>$KGrde-24zyl5)MZh9brS;nKMd_Uxro0*!!guii?n|8hJVHgBJ4Ph z89*W-EYH>!8#FPuH@|UeKkJSO6+;gT5(uRVqQw$;K=_)v?FabM5U>$7c?$E*j58XM zg2W0s5qa`pl4+M;c&^?L2WoVX24$?{-jmdmKx6T9%Q87lA|#RozBbz$x(FF=VPRuJ z)pTXNRI0x#oLyPb5mOx}!wcn#?JV+iZWUE`p`-{FLMef z0V0`Z{mB2?`{C}mq8_iJ?CM}6d-lSqPtJ->vX1#X!N-tL=u(E7L#Z%R%}L_sQj-1%$bT8wWjs1H`lOx5Li=+&Ai0I)7n8<2*R9Z6wd0tb{ z-$8$WxnY#r7AU_T*JDL<8U2D+K&~W5r4m+#Q|%4t}!CD^5Pz zGT0d-nHiZJPu()#$?uJCn4JFJpx%k2xV(gX-MSic6mQ!KuX)UXWr3h9E z)>D#snm`#DS#6$^LYb*pjc&Z7TZ zbAPCj%5`BjQh#xR9l}gI_cblDBU_w^K3q;# zxfwl10$&SN+n*`_Ru$)`H$>pxh2<_3x+pFGkurAEhekqx&E%e{WXq7^-TtTZ)MIq{ zZd%3#ukkpz*C-H6k_y{`VnNRw?ehpd9!mW_+WJr>lxSoz4G&$hPucKwJZ=L@0$oIE zE9PvpL*a2G|L@|ky8L+#`Cj9{D;%~SHDN8j^SRPmj!A_YF7Wk=cFGe}elh;GTpZ6c zqNjSVez`amWlJ%WepVX8-#ViUMt?o^)zTIKzs~ucv&J{0#RhOPar`YVy1f-hh zx%_=96pci`0%uupNb_m2Q(2G8>Vj~pmi2SK;m?S^LRyuK z{L9adB9%R$Y1-bp+Kjj}4jMUb>!*fo*))Z-ebPad*g_tsM{fis^pfxQP91PR8x42YvnR|dP@joS;P{qnN z?Q6Vjd0mex%k4kgYGpi@UmKxmix;eH)AuZPDP$~V%kqP!EVIp3%;W{2q(9&=8|@q? zFYJ!uiX+j#Sc+B$a7S!CWy{SQExX zAu_x&=FVUzb`(j#!k&hvY8#%L@+(p>DXGtvlhUCzk?ZK88P@~v=8|II*ceb0%TlSG-U*f+m*T<+sa4^t&Yn?2x`V!uj>wKOC4G=q}Twws5E{<45>90%%hj`GTk#Z7gRk61ChVf3=0FQS)IME~>acn5B|h@|~LY zh{$F%eq!C}Go?m}(*eWm?`1ao%PKX3j^wK}WVg=HBGHK+Uybrd*%+~~qT--6yg>wa z#%dxtuoyw8P7ja^YX7c))ID9G@E=bAa4JBw3*OZWYKpiTTGeZws84~o8(pyOSFf%} z@&U%R_662tO|a>ZQ?ple@4lj=hD;2CLghDM7ke?O%L^|rhze#>;HiV<_I6W_kpnIM ziy*W*r=x0up=|$9_Vk}2jOhDAjn=QZ9Oz1{nOV8H%xlTIjNy|Z>|SGp_CIgRzQsHn zRN7t$KBNJmJ4UA#)yvlw4q)HD<8uc4tnF{JoaroQjdS*!*v^v zP5#q_62BdNs{-Pzpev>W{tRl(;0gng6m%k<;crGwPO$TSK!QBYlPsWEPut8IP|p{T zyF8O%zLfvCCydr%7~&nHA?)`Ieckf)%Sb$LqwEQ};X?FH;n^Mc>Fd-yM~RGRPXt@v zPewKNcBFbX>VfIIgIVU*^lt3JXHDIw*c{RkEY1j?tf*BQU@sn!Wab2%8#TcHgn&-m z2k2Pd%Sj128XQ632LMY$=WfeE1?*|RF=Fh(Tk@20y{VgZ^5^^c9ry_^36<$YLLiNT zvPc&zEk*ejlWbO(J9Lxp=2wUHqs9rd=he=< z+}zH_BXGZ}Yt$Ar5$x%_lJd=%3<_XR;)&5o6NTeU@GVInrbfi?XuOl6`+PH07c}~p zv<_Eo0xHQYPMKb==5cyIn%Bt~xLb(?+{y?%TzZh{Ar`7}{sWeZ&Sy`M;=vn;e7zgq??%NM9#I;n zSP-I%|9k#He5#+zE9$yi+-(Z~=wUZ<)I8c-6i1vbYfPYC{UU8-_eos$; z;As(8R$$vix5iT8NZtxj2}#M&tZXMycjc1j&7E0ez>PTe52ApsY^Zx47)@^~BHm&c zp+e*S@;9vnAi#0(^aNmwS#gFnp_g}1($QoiAmYaG-?48{XbW_nc)%~p@FCHD&R_Jr zJ@E1|cr?Vf#1B^s+R%QedYYlI&Q3ZFiE00!oO9oq$2rnzApka=QBuOnbn((N{yIsQ zh`&fF^yKqrtkj3_HmlxGmM)aYEWPrC2nL{U``LWD0m3a;p#G`PnJ#{F^zFo7;Ao&u zQ9K8yR_I#~sAa!pA~VH!7yd{K^HYOnwse%tA;T;Dw-G9peRZR`g|9y^5A8T#AFqvZ zjpfp!x(k%-31fqOGDGl-se|-5+1NJ+^tu}Yqfnt7q_T*>KuN*{weir3qck#~zhY1r ze1BzqF46?_bYPQ(Ya?#fm-`0EefL89Qr`LwgFedX10wm!w2h4)lwyq2$T)op4D(d& zlFkSxc*lgno5*AaG!0ohH8`ed0g7~g@^`J}09|!#nOj&G4CETomR!SXGNkY^@iHSy z$rq6hUjsl(HU`86W}10llp7EkX{T!rKf46QGS}R=sF~_sE66L3h^Nv`?>j!-Z)@1n zT)UWQOVTdG?yiaS8e`gryKwUO8iz`|d@PftXFcVHY2DMeNv3MCUAlXI*u9vPxOodw zIv_P&>G+8J{lZtIGwkJIv3!kV$}$2pRUmC)uyk{Ly#?znFWAoy#YbH6DI0QnGAyAwg3bT)>{(o75OJ9!fMJojY`j>FL%wY8Q{8s+Sv zv=0x@pc>v0h9!ZH4yn?3Ixsl4u63#IpohlWMeSoDPg5%fWf3&QOzBbU{Nbvj-C)0Aj;{@N5W&jFvYS!lYfg z^jsGIJXGjy{x!oFS|z855H3>sd`wV@?n{x2@LiF-`lH1l2G4ASLrReM!U(%(%b%#< z4}SR+ucsr{hTWo8tH|U}o)sI{;2kwSkO&J4NEGE}>Q}o155)!0dqBi|9cPga5Z@PA zIAr)UcCua`>9s$3&;p6rPTh?1pS`?jI$wB#ER2m0cu#BXt~ozgv6OHhTjrS5#o3GF zhJJL2%@xUPw(t3pcxXn&E4+kbV9|38@{gxGmcW0+W#KN)xt} z8li}fAi<|El;HX?=BQdmzlJ|%!Rg|{K6Y`Y3uv_M&HNN~hcCrg9oSV|LJ6u}J%6H2 z*1o=-iy$ga3OX$hXT|DKKK=Nfj3$;{mIh68mLObM2+_(vvF@-XwXSNqwdg>}M_7tL zKTRGl)|BGv4AFsqXKMDAnu)qlTHzb_A7ip(Jo|z#?MJN7mLv9 zRQY`<->Y-4`3n+~#5Hhf;)On4mOVW>LrG(ht#BK}5J11l;Nmlvfc5jfk$T)fw467H zJ{x^&>ht1N_xxmckXw3;O||?KR8j3Jqj`y0Yo&o(IMr-g58B76sn$$POwRm`pjif8 z?jCr=C!^=`_fa^=X{NGid;Np1{0K~r%gCQU*VwTf*wP<)aB_GL-X-%XxEyzrHmKZC zwb>5Na>LA9kwBisd@dA@A3I{A||P(T(c8uc&;ME2T%uZ;yaH)|B1 z_b?umbcR##lg1~XW`_BBe_LNA3*w~&oVT%6{g?T2r+v7V&O3%jogxDczTuyz<%$cf z=KBvzEE!36Z`V5cgTrYHl6mV@UsWfsCwxjsD`dPpAuqJnXxr{qzRwX)LD_P8xCI}7 z6u{I>x*ri!IJb4W8iGl(j$cC(3gNWP!9_x%J;&Cyhv4x! zc`oCJWS8}u`&&HG;hlz>_PTc=uG+gppVW%p2K+rP)DY*0ABs^f5`qR>2B0fB;6>{N z3LR`ME$6Zjb@`r6#}g2sfa4^T3>KGFI;a`7fT;=;ZGZeMzcX{8B5mGOY7U3q^hxG*2j({jf zti8XOXw_6~#h3b-4_DikjusQvf5=(#Ge8IJxCwSUlpZPF2_Xgb4TbX{sihxOnAOs@ zwQf}66km~*U+%SXH$z(am_Recu<;z~qgL4Dxj~5F1%v+_Cr?(S=Lt%*{5UL2I=yb=c zsih;#S6iZ+0czB0zF+e-{|RT~ceC*>^60;B`Ea_o=Ez!gOKKTlwE`*T1pfyn=A%SK zU`_NG7dp{ny%xD%SQq#@#P_T0WmTI)Z@_*u&yok)tD?V{`;pTsV-BHRG+eCgXC(g0 z+h}mW`*kKVMox1h$xnl~TF2XYKU)dVQJcNx#>z(9cmZ_uD$s}oRe~fFIXv+gS(-1P zUYx>Zr9LrHwD+l%TDAu~jlO9pQ)ZW5ySfJ@YRcyqQd--nJwG|c z#afLiXmBx}eZg&9yLK*|;Ee{2ksg8L5?WuQjV>|B4!m93Z7GHR?Eawgi_LPyhpRV` zJty+u8!>;Rh377Hcz+n|_m*ax{>oVff$-|DLbCml7=D@h)dw%{{Y+-@@CTm`L(_=? zTP2ij_ZLW{WzCDZ-HY9Hk3BbbPg!52Mbr|83t9||vY?5tv6Ukl_!*?I2{T+e7ginr zz=iWV)$6HQP6~iM5u+16;n09mQ)Z;VuW_=ycEFF7RIIJ+0QX<6gix43i{lf9Mo9ua zMve!m1!FZ=3R}WZ z@V}AH8uC^Xm;Vm4{cwdEFQ=CuhY*GV`c%{6@X@ZX>;7;2u4ChJsBo-dy_9ryk$i6g zTSn0cKv@el1;Ya4uL9n@epd!GZbuIf|9-xht~8wqq<>zuqQS!Z@mie_`0r{MgVgQg z1Ucn~k`<2j*Tu7j=wF1JedR-Qne#zo+(1_2o{#X!8VlE?_#yD9-gP;Yc^q|9dMXM~ z-(Up>{zKo*obSiG*#Q_v=YLHEnPrNQP|8Zt2A0t!dFa$k5Qci=5=hkNI?k;m&=eT4 z!ziAe(pgpPrIAa2IK}UEsNMVKeeu8x!eR*XFMU_-tw*e-g#;(1{BKDpxQx>kKG#b8 z=v}-ir&w08AC;zoB&ht!EY`JcL=L`uKHMBTq+LtS>WwwU@1zC5-8ipgON?Ds5d-+E%#!5~U_gAF99kY$9 z4IYyU$wH0bveygC^10qiCx5ALI}uJ?HeJ;mPu#~f*^Q=-J(;9$QyugV;0|*zT6Baw zTAbgXT3XsdfroBRwp2d#4{~~0)+K*icH})6E98dCg|Heq_EWt80R!QUQ0crk5>I+p zNJllDQ(Zv;`o{+MO*r3n%VGW;1nIIAy~)iLlVm zfGs6ra4$dg$_)a3frA*xO*&rd?mGWrGe7&jE;0@n zi?(foZn9$T{GPymCU402y5-a+OXHrdAt#e^~ zbjCcgCdTvKTJUc#x8&QVdmv*Lu(w-OJ3<5ax)e zvmKF}&Eko@rHR7Pj3o+(wm_%j;xc{cWArcWPm?VhTk_p86!+pTO22<>d~M}fiCrFj zeCJZakvNcu4rvAWS)d=QK92z(l)(%8Y+9NqGKJ)bm;w#XW{!w36c?fr!tKHul(ikN>rbUm^8Ht)}5YWgIRB1KWk6S z73it@M_s*trGp$F7cjhcGmAo;G+%oZM4V7%UCCbK8?j_o58$7EAzx7`ow!kv2I}B{ zmR>>2ZNDwK1_1PV)b9SoSKFwR&d#{|7NGGs-{#kK1}G89$E(_<|E`2b#eAwk-@>O# z(h_F)E!Y91RmG1xqWK!Tf5^G3w<~8EDB+pyU!KEonbU53Ni0U~o;F5tsgQyT69O(B71Z-wsg}fXLcTw`!r*y541FJ^n?60JkEK&rT;zkV=$8`{GJ4 zYm)^T2_R>GK@@=!P5+YX{nZ`mKs@sO z>-Dq>n?N3e#*tBLj4-jKIh7oSkQTdU1F_|!$Ea(s)wCGRHaEmGbc?RO0IVpi2w##S zCo@=U$$oh~&9A*3`1^3`ee-=*k6E=MW@=6~n;(C6*>cI1DP<3E>6LkABuPdt8LMTg zb@?~Lic_L1;g;iXmuj5=b)SVQ4s%X*wI8ID0rhYq;y3Zm{xtWYCdK#Wg!iegR=52g zR$gAAeQ(>g@Wrr@;Hu4jb&xN%_2T526a+%DAcZ5By~euNgAS9oG@)fY*ha5bpubT= zVaHS`do4q8>b(Uw1_T_n8i@+G=9+p~enVVRis$O^J15anhba8-01YQK*lo<+9ko!P zqnc>7DdjYQ%F=0B^_{7M@6~K_TU1e@IVz;W2wBg-YV1Bo8s+wZVK@~nP%``+n<@WY z;pgGO1$)&Ob5d)~{$htuM*YhMX+w)_A4hU1iN5Sm^mxe>d%Jo~Eq?^}=J(!�|+ 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%0A>N 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 HGzk1Z6JPc5 literal 0 HcmV?d00001 From 139f5a3526f9412eed6a6987c5ded38dd2463375 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Wed, 31 Dec 2025 16:26:15 +0900 Subject: [PATCH 037/167] Rename Calculation diagram_ko.png to 2025-algorithm-diagram-ko.png --- ...diagram_ko.png => 2025-algorithm-diagram-ko.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename 2025/docs/ko/assets/{Calculation diagram_ko.png => 2025-algorithm-diagram-ko.png} (100%) diff --git a/2025/docs/ko/assets/Calculation diagram_ko.png b/2025/docs/ko/assets/2025-algorithm-diagram-ko.png similarity index 100% rename from 2025/docs/ko/assets/Calculation diagram_ko.png rename to 2025/docs/ko/assets/2025-algorithm-diagram-ko.png From 653977be0627e88fa908c3f3902f61981ae7f090 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Wed, 31 Dec 2025 16:27:05 +0900 Subject: [PATCH 038/167] Update image reference for security risks document --- 2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index 7550cfbe7..234f56aaf 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -1,7 +1,7 @@ # 애플리케이션 보안 위험이란 무엇인가? 공격자는 애플리케이션을 통해 다양한 경로로 비즈니스 또는 조직에 피해를 입힐 수 있다. 각 경로는 잠재적 위험을 수반하며, 이를 조사해야 한다. -![Calculation diagram](../ko/assets/2025-algorithm-diagram.png) +![Calculation diagram](../ko/assets/2025-algorithm-diagram-ko.png)
From c890363a1c4a3bb6531ee3897b4043ae1230147a Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 13:37:42 +0900 Subject: [PATCH 039/167] Add index.md file in the ko directory --- 2025/docs/ko/index.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 2025/docs/ko/index.md diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md new file mode 100644 index 000000000..b03a6d174 --- /dev/null +++ b/2025/docs/ko/index.md @@ -0,0 +1,40 @@ +# OWASP Top 10:2025 + +Welcome to the OWASP Top 10:2025 Release. + +The OWASP Top 10 is a standard awareness document for developers and web application security. It represents a broad consensus about the most critical security risks to web applications. + +## About This Release + +This is the **2025** version of the OWASP Top 10. This version includes updates based on the latest data and security trends. + +## Main Project Page +The [main project page](https://github.com/OWASP/www-project-top-ten) has information about older versions and metadata about this project. + +## Getting Started + +Start with the [Introduction](0x00_2025-Introduction.md) to learn about what's new in the 2025 version. + +## Navigation + +- [Introduction](0x00_2025-Introduction.md) +- [About OWASP](0x01_2025-About_OWASP.md) +- [What are Application Security Risks?](0x02_2025-What_are_Application_Security_Risks.md) +- [Establishing a Modern Application Security Program](0x03_2025-Establishing_a_Modern_Application_Security_Program.md) + +### Top 10:2025 List + +1. [A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md) +2. [A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md) +3. [A03:2025 - Software Supply Chain Failures](A03_2025-Software_Supply_Chain_Failures.md) +4. [A04:2025 - Cryptographic Failures](A04_2025-Cryptographic_Failures.md) +5. [A05:2025 - Injection](A05_2025-Injection.md) +6. [A06:2025 - Insecure Design](A06_2025-Insecure_Design.md) +7. [A07:2025 - Authentication Failures](A07_2025-Authentication_Failures.md) +8. [A08:2025 - Software or Data Integrity Failures](A08_2025-Software_or_Data_Integrity_Failures.md) +9. [A09:2025 - Security Logging and Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md) +10. [A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md) + +--- + +**Note:** Translations will be added as they become available. From 121efa985bcc489f117d22801262e2cce78da515 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 13:59:07 +0900 Subject: [PATCH 040/167] Translate index.md content to Korean --- 2025/docs/ko/index.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index b03a6d174..d7c810cd7 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -1,30 +1,30 @@ # OWASP Top 10:2025 -Welcome to the OWASP Top 10:2025 Release. +OWASP Top 10:2025 버전에 오신 것을 환영합니다. -The OWASP Top 10 is a standard awareness document for developers and web application security. It represents a broad consensus about the most critical security risks to web applications. +OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제고용 자료이며, 웹 애플리케이션의 가장 중대한 보안 위험에 대한 업계의 폭넓은 합의를 반영한다. -## About This Release +## 이번 버전 소개 -This is the **2025** version of the OWASP Top 10. This version includes updates based on the latest data and security trends. +이 문서는 OWASP Top 10의 2025년 버전이다. 최신 데이터와 보안 동향을 반영하여 업데이트되었다. -## Main Project Page -The [main project page](https://github.com/OWASP/www-project-top-ten) has information about older versions and metadata about this project. +## 메인 프로젝트 페이지 +[메인 프로젝트 페이지](https://github.com/OWASP/www-project-top-ten)에는 과거 자료를 포함한, 해당 프로젝트의 메타데이터가 정리되어 있다. -## Getting Started +## 시작하기 -Start with the [Introduction](0x00_2025-Introduction.md) to learn about what's new in the 2025 version. +2025년 버전에서 변경되거나 추가된 내용을 파악하려면 [소개](0x00_2025-Introduction.md) 페이지를 획인하라. -## Navigation +## 목차 -- [Introduction](0x00_2025-Introduction.md) -- [About OWASP](0x01_2025-About_OWASP.md) -- [What are Application Security Risks?](0x02_2025-What_are_Application_Security_Risks.md) -- [Establishing a Modern Application Security Program](0x03_2025-Establishing_a_Modern_Application_Security_Program.md) +- [소개](0x00_2025-Introduction.md) +- [OWASP란?](0x01_2025-About_OWASP.md) +- [애플리케이션 보안 위험이란 무엇인가?](0x02_2025-What_are_Application_Security_Risks.md) +- [현대적 애플리케이션 보안 체계를 수립하는 법](0x03_2025-Establishing_a_Modern_Application_Security_Program.md) -### Top 10:2025 List +### Top 10:2025 목록 -1. [A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md) +1. [A01:2025 - 불충분한 접근 제어](A01_2025-Broken_Access_Control.md) 2. [A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md) 3. [A03:2025 - Software Supply Chain Failures](A03_2025-Software_Supply_Chain_Failures.md) 4. [A04:2025 - Cryptographic Failures](A04_2025-Cryptographic_Failures.md) @@ -37,4 +37,4 @@ Start with the [Introduction](0x00_2025-Introduction.md) to learn about what's n --- -**Note:** Translations will be added as they become available. +**참고:** 번역은 준비되는 대로 순차적으로 추가될 예정이다. From 79a82fbf4f1e0e05b06f8a2d15b15c11d5149cbd Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 14:43:36 +0900 Subject: [PATCH 041/167] Update about OWASP title --- 2025/docs/ko/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index d7c810cd7..6ac867a02 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -18,7 +18,7 @@ OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제 ## 목차 - [소개](0x00_2025-Introduction.md) -- [OWASP란?](0x01_2025-About_OWASP.md) +- [OWASP 소개](0x01_2025-About_OWASP.md) - [애플리케이션 보안 위험이란 무엇인가?](0x02_2025-What_are_Application_Security_Risks.md) - [현대적 애플리케이션 보안 체계를 수립하는 법](0x03_2025-Establishing_a_Modern_Application_Security_Program.md) From b8c9850771e12eeab1116021eecec31996b858c7 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 16:29:36 +0900 Subject: [PATCH 042/167] Fix folder name --- 2025/docs/{kr => ko}/0x00_2025-Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename 2025/docs/{kr => ko}/0x00_2025-Introduction.md (96%) diff --git a/2025/docs/kr/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md similarity index 96% rename from 2025/docs/kr/0x00_2025-Introduction.md rename to 2025/docs/ko/0x00_2025-Introduction.md index 78b4464b6..8e749aaf7 100644 --- a/2025/docs/kr/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -59,7 +59,7 @@ MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하 ## 카테고리 선정을 위한 데이터 사용법 -2021년 버전과 마찬가지로 *악용가능성(Exploitability)* 및 *기술적 영향도((Technical) Impact)*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. +2021년 버전과 마찬가지로 *악용 가능성(Exploitability)* 및 *기술적 영향도((Technical) Impact)*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. CVSSv2에서는 Exploit과 (Technical) Impact 모두 최대 10.0까지 가능하였으나, 공식에 따라 Exploit은 60%, Impact는 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 Exploit 6.0, Impact 4.0으로 제한되었다. 가중치를 고려한 결과, Impact 점수는 CVSSv3에서 평균적으로 약 1.5점 상승하였고, Exploitability는 평균적으로 약 0.5점 하락하였다. From 042a56480f0bf45d18bf022c19e1d3f8866adeae Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 16:33:43 +0900 Subject: [PATCH 043/167] Update formatting and bullet points --- 2025/docs/ko/0x00_2025-Introduction.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 8e749aaf7..d8bba7b4f 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -31,8 +31,8 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ![Mapping](../assets/2025-mappings.png) # OWASP Top 10 2025 -**[A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. -**[A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. +* **[A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. +* **[A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. * **[A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md)**기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. * **[A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. * **[A05:2025 - Injection](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동은 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. @@ -40,7 +40,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! * **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/A07_-Identificatio_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다 * **[A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 Software Supply Chain Failures보다 상대적으로 더 로우 레벨(Lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary) 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. * **[A09:2025 - Security Logging & Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 로그에서 발생한 이벤트에 대해 적절한 대응을 위한 알림(Alert) 기능의 중요성을 강조하기 위한 것이다. 알림 체계가 결여된 로깅은 보안 사고를 식별하는 데 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. -**[A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(Fail Open) 등 비정상적인 상태에서 비롯되는 24개 CWE를 포함하고 있다. +* **[A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(Fail Open) 등 비정상적인 상태에서 비롯되는 24개 CWE를 포함하고 있다. ## 방법론 @@ -79,7 +79,6 @@ CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 ## 데이터 제공자들께 드리는 감사의 글 -**** 다음 조직들은 익명 기부자 다수와 함께 280만 건 이상의 애플리케이션 데이터를 제공하여 역대 가장 방대하고 포괄적인 애플리케이션 보안 데이터 세트 구축에 기여하였다. 이들의 도움 없이는 불가능한 작업이었다. * Accenture (Prague) From 7d9d30b38e16fe95ab7e93c9ba570ae1bfbc19fc Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 16:35:37 +0900 Subject: [PATCH 044/167] remove h1 section that is not in the original doc --- 2025/docs/ko/0x00_2025-Introduction.md | 1 - 1 file changed, 1 deletion(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index d8bba7b4f..2a8e3a5da 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -29,7 +29,6 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! 2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. ![Mapping](../assets/2025-mappings.png) -# OWASP Top 10 2025 * **[A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. * **[A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. From f85e2bad259626eb91ebf8d070ff87274eda28a9 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 19:06:14 +0900 Subject: [PATCH 045/167] Refine the title for establishing a modern application security program --- 2025/docs/ko/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index 6ac867a02..c628f0f03 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -20,7 +20,7 @@ OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제 - [소개](0x00_2025-Introduction.md) - [OWASP 소개](0x01_2025-About_OWASP.md) - [애플리케이션 보안 위험이란 무엇인가?](0x02_2025-What_are_Application_Security_Risks.md) -- [현대적 애플리케이션 보안 체계를 수립하는 법](0x03_2025-Establishing_a_Modern_Application_Security_Program.md) +- [현대적 애플리케이션 보안 체계 수립](0x03_2025-Establishing_a_Modern_Application_Security_Program.md) ### Top 10:2025 목록 From 90478a8f5b14b4499fafc5dcc8bd9c2013a44ad1 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 20:59:44 +0900 Subject: [PATCH 046/167] Translate and update the first content --- ...g_a_Modern_Application_Security_Program.md | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 7ae94c703..375990bcb 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -1,67 +1,66 @@ -# Establishing a Modern Application Security Program +# 현대적 애플리케이션 보안 체계 수립 -The OWASP Top Ten lists are awareness documents, meant to bring awareness to the most critical risks of whichever topic they cover. They are not meant to be a complete list, only a starting place. In previous versions of this list we have prescribed starting an application security program as the best way to avoid these risks, and more. In this section we will cover how to start and build a modern application security program. +OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 항목에서 다루는 중요한 위험의 인식을 높이기 위함이다. 이는 모든 위험을 망라한 목록이 아니라, 대응을 시작하기 위한 출발점으로 활용하도록 구성되어 있다. 따라서, 이전 버전에서부터 각 항목에 해당하는 위험을 예방하고 더 나아가 전반적인 보안 수준을 높이기 위한 최선의 방법으로 애플리케이션 보안 체계를 시작하는 것을 권고해왔다. 이 페이지에서는 현대적 애플리케이션 보안 체계를 수립을을 어떻게 시작하고 구축하는지 다룰 것이다. -If you already have an application security program, consider performing a maturity assessment on it using [OWASP SAMM (Software Assurance Maturity Model)](https://owasp.org/www-project-samm/) or DSOMM (DevSecOps Maturity Model) . These maturity models are comprehensive and exhaustive and can be used to help you figure out where you should best focus your efforts for expanding and maturing your program. Please note: you do not need to do everything in OWASP SAMM or DSOMM to be doing a good job, they are meant to guide you and offer many options. They are not meant to offer unattainable standards or describe unaffordable programs. They are expansive in order to offer you many ideas and options. +이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP SAMM (Software Assurance Maturity Model)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려하라. 해당 모델들은 포괄적이며 세부 항목까지 망라하고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 또는 DSOMM의 모든 항목을 수행해야만 제대로 하고 있다고 볼 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. -If you are starting a program from scratch, or you find OWASP SAMM or DSOMM ‘too much’ for your team right now, please review the following advice. +애플리케이션 보안 체계를 처음 구축하는 단계이거나, 현재 팀의 상황에서 OWASP SAMM/DSOMM가 과도하다고 느껴진다면, 아래 조언을 참고하라. -### 1. Establish a Risk Based Portfolio Approach: +### 1. 위험 기반 포트폴리오 관리 체계 수립 -* Identify the protection needs of your application portfolio from a business perspective. This should be driven in part by privacy laws and other regulations relevant to the data asset being protected. +* 비즈니스 관점에서 애플리케이션 포트폴리오의 보안 요구사항을 식별한다. 이때 해당 데이터에 적용되는 개인정보보호 법령 및 관련 규제 요구사항을 기준으로 요구사항을 도출한다. -* Establish a [common risk rating model](https://owasp.org/www-community/OWASP_Risk_Rating_Methodology) with a consistent set of likelihood and impact factors reflective of your organization’s tolerance for risk. +* 조직의 위험 수용 수준에 맞춰, 가능성과 영향도 기준을 표준화한 [통합 위험 평가 모델](https://owasp.org/www-community/OWASP_Risk_Rating_Methodology)을 수립한다. +* 위의 정의된 모델에 따라 전체 애플리케이션 및 API의 위험을 평가하고 우선순위를 결정한 뒤, 결과를 구성 관리 데이터베이스(Configuration Management Database, CMDB)에 등록한다. -* Accordingly measure and prioritize all your applications and APIs. Add the results to your [Configuration Management Database (CMDB)](https://de.wikipedia.org/wiki/Configuration_Management_Database). +* 적용 범위와 요구되는 엄격도 수준을 정의하기 위한 가이드라인을 수립한다. -* Establish assurance guidelines to properly define coverage and level of rigor required. +### 2. 탄탄한 기반을 통한 실행 체계 확보 -### 2. Enable with a Strong Foundation: +* 모든 개발 조직이 준수할 애플리케이션 보안 최소 기준을 맞추기 위한 정책 및 표준을 수립한다. -* Establish a set of focused policies and standards that provide an application security baseline for all development teams to adhere to. +* 수립한 정책 및 표준을 따를 수 있도록 재사용 가능한 공통 보안 통제를 정의하고 설계 및 개발 지침을 함께 제공한다. -* Define a common set of reusable security controls that complement these policies and standards and provide design and development guidance on their use. +* 개발자의 역할과 주제에 맞춘 애플리케이션 보안 교육 체계를 마련한다. -* Establish an application security training curriculum that is required and targeted to different development roles and topics. +### 3. 기존 프로세스에 보안 내재화 -### 3. Integrate Security into Existing Processes: +* 기존 개발 및 운영 프로세스에 안전한 구현 및 검증 활동을 정의하고 내재화한다. -* Define and integrate secure implementation and verification activities into existing development and operational processes. +* 검증 활동에는 위협 모델링, 안전한 설계 및 설계 검토, 시큐어 코딩 및 코드 리뷰, 침투 테스트, 그리고 취약점 조치가 포함된다. -* Activities include threat modeling, secure design and design review, secure coding and code review, penetration testing, and remediation. - -* Provide subject matter experts and support services for development and project teams to be successful. - -* Review your current system development life cycle and all software security activities, tooling, policies, and processes, then document them. - -* For new software, add one or more security activities to each phase of the system development life cycle (SDLC). Below we offer many suggestions of what you can do below. Ensure you perform these new activities on every new project or software initiative, this way you will know each new piece of software will be delivered at an acceptable security posture for your organizations. +* 개발 및 프로젝트 팀이 각 활동을 성공적으로 수행할 수 있도록 주제별 분야 전문가(subject matter expert)와 지원 서비스를 제공한다. + +* 현행 시스템 개발 수명 주기(system development life cycle, SDLC)와 모든 소프트웨어 보안 활동, 도구, 정책, 프로세스를 검토한 후 이를 문서화한다. -* Select your activities to ensure your final product meets an acceptable level of risk for your organization. +* 신규 소프트웨어의 경우, 시스템 개발 생명주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서는 수행 가능한 다양한 제안을 제공한다. 이러한 신규 활동을 모든 신규 프로젝트 또는 소프트웨어 이니셔티브에 대해 수행하도록 보장한다. 이를 통해 각 신규 소프트웨어가 조직에 허용 가능한 보안 상태(security posture)로 제공(납품)됨을 알 수 있다. +* 새로운 소프트웨어 개발 시에는 시스템 개발 생명주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서 수행 가능한 다양한 활동을 제시한다. 제시된 활동을 수행하여 모든 새로운 프로젝트 또는 소프트웨어에 조직의 요구 사항에 부합하는 보안 수준이 제공되도록 한다. -* For existing software (sometimes called legacy) you will want to have a formal maintenance plan, please look below for ideas of how to maintain secure applications in the section called 'Operations and Change Management'. +* 최종 산출물이 조직의 수용 가능한 위험 수준을 만족하도록 활동을 선정한다. +* 기존(때로는 레거시라고 함)의 소프트웨어의 경우 유지관리 계획을 수립한다. 안전한 애플리케이션을 유지하는 방법은 아래의 운영 및 변경 관리 섹션을 참고한다. -### 4. Application Security Education: -* Consider starting a security champion program, or general security education program for your developers (sometimes called an advocacy or security awareness program), to teach them everything you wish they would know. This will keep them up to date, help them know how to do their work securely, and make the security culture where you work more positive. It often also improves trust between the teams and makes for a happier working relationship. OWASP supports you in this with the [OWASP Security Champions Guide](https://securitychampions.owasp.org/), which is being expanded step by step. +### 4. 애플리케이션 보안 교육 -* The OWASP Education Project provides training materials to help educate developers on web application security. For hands-on learning about vulnerabilities, try the [OWASP Juice Shop Project](https://owasp.org/www-project-juice-shop/), or [OWASP WebGoat](https://owasp.org/www-project-webgoat/). To stay current, come to an [OWASP AppSec Conference](https://owasp.org/events/), [OWASP Conference Training](https://owasp.org/events/), or local [OWASP Chapter](https://owasp.org/chapters/) meetings. +* 개발 조직의 보안 역량 강화를 위해 보안 챔피언(Security Champion) 제도 또는 개발자 대상 보안 교육 프로그램(보안 인식 프로그램이라고 부르기도 함)을 도입하는 방안을 검토한다. 이를 통해 개발자에게 필요한 지식을 교육할 수 있다. 이를 통해 개발자가 최신 보안 지식을 지속적으로 습득하고, 안전한 방식으로 업무를 수행할 수 있도록 지원하며, 조직 내 보안 문화를 보다 긍정적으로 만든다. 또한 보안팀과의 신뢰를 향상시키고 더 만족스러운 협업 관계를 형성할 수 있다. 관련 가이드는 [OWASP 보안 챔피언 가이드](https://securitychampions.owasp.org/)를 참고하며, 해당 가이드는 단계적으로 보강되고 있다. +* OWASP 교육 프로젝트는 개발자에게 웹 애플리케이션 보안을 교육하는 데 필요한 교육 자료를 제공한다. 취약점에 대한 실습 중심 학습을 위해 [OWASP Juice Shop Project](https://owasp.org/www-project-juice-shop/) 또는 [OWASP WebGoat](https://owasp.org/www-project-webgoat/)를 활용한다. 최신 동향을 유지하기 위해 [OWASP AppSec 컨퍼런스](https://owasp.org/events/), [OWASP 컨퍼런스 트레이닝](https://owasp.org/events/), 또는 지역 [OWASP Chapter](https://owasp.org/chapters/) 모임에 참여한다. -### 5. Provide Management Visibility: -* Manage with metrics. Drive improvement and funding decisions based on the metrics and analysis data captured. Metrics include adherence to security practices and activities, vulnerabilities introduced, vulnerabilities mitigated, application coverage, defect density by type and instance counts, etc. +### 5. 지표 가시성 확보 -* Analyze data from the implementation and verification activities to look for root cause and vulnerability patterns to drive strategic and systemic improvements across the enterprise. Learn from mistakes and offer positive incentives to promote improvements. +* 지표를 기반으로 관리하라. 수집된 지표 및 분석 데이터를 기반으로 개선 활동과 예산 의사결정을 추진한다. 지표로는 보안 활동 준수, 신규 취약점 유입, 취약점 조치, 테스트된 애플리케이션 범위, 결함 유형별 밀도 및 발생 건수 등이 있다. +* 구현 및 검증 활동에서 축적된 데이터를 분석하여, 근본 원인(root cause)과 취약점 패턴을 식별하고, 전사 차원의 전략 및 시스템적 개선을 추진한다. 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공한다. ## Establish & Use Repeatable Security Processes and Standard Security Controls @@ -151,7 +150,7 @@ If you are starting a program from scratch, or you find OWASP SAMM or DSOMM ‘t * Finalize all documentation, including the change management database (CMDB) and security architecture. -### Operations and Change Management: +### 운영 및 변경 관리 * Operations must include guidelines for the security management of the application (e.g. patch management). From ae6effdfc7d800ac41b9e962cbbb8c69036913c4 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 1 Jan 2026 21:12:54 +0900 Subject: [PATCH 047/167] typo --- ...g_a_Modern_Application_Security_Program.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 375990bcb..3cb032f62 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -1,19 +1,19 @@ # 현대적 애플리케이션 보안 체계 수립 -OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 항목에서 다루는 중요한 위험의 인식을 높이기 위함이다. 이는 모든 위험을 망라한 목록이 아니라, 대응을 시작하기 위한 출발점으로 활용하도록 구성되어 있다. 따라서, 이전 버전에서부터 각 항목에 해당하는 위험을 예방하고 더 나아가 전반적인 보안 수준을 높이기 위한 최선의 방법으로 애플리케이션 보안 체계를 시작하는 것을 권고해왔다. 이 페이지에서는 현대적 애플리케이션 보안 체계를 수립을을 어떻게 시작하고 구축하는지 다룰 것이다. +OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 항목에서 다루는 중요한 위험의 인식을 높이기 위함이다. 이는 모든 위험을 망라한 목록이 아니라, 대응을 시작하기 위한 출발점으로 활용하도록 구성되어 있다. 따라서, 이전 버전에서부터 각 항목에 해당하는 위험을 예방하고 더 나아가 전반적인 보안 수준을 높이기 위한 최선의 방법으로 애플리케이션 보안 체계를 시작하는 것을 권고해왔다. 이 페이지에서는 현대적 애플리케이션 보안 체계를 수립을 어떻게 시작하고 구축하는지 다룰 것이다. -이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP SAMM (Software Assurance Maturity Model)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려하라. 해당 모델들은 포괄적이며 세부 항목까지 망라하고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 또는 DSOMM의 모든 항목을 수행해야만 제대로 하고 있다고 볼 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. +이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP SAMM(Software Assurance Maturity Model)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려하라. 해당 모델들은 포괄적이며 세부 항목까지 망라하고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야만 보안을 제대로 하고 있다고 볼 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. + - -애플리케이션 보안 체계를 처음 구축하는 단계이거나, 현재 팀의 상황에서 OWASP SAMM/DSOMM가 과도하다고 느껴진다면, 아래 조언을 참고하라. +애플리케이션 보안 체계를 처음 구축하는 단계이거나, 현재 팀의 상황에서 OWASP SAMM 및 DSOMM가 과도하다고 느껴진다면, 아래 내용을 참고하라. ### 1. 위험 기반 포트폴리오 관리 체계 수립 -* 비즈니스 관점에서 애플리케이션 포트폴리오의 보안 요구사항을 식별한다. 이때 해당 데이터에 적용되는 개인정보보호 법령 및 관련 규제 요구사항을 기준으로 요구사항을 도출한다. +* 비즈니스 관점에서 가지고 있는 애플리케이션의 포트폴리오에서 보안 요구사항을 식별한다. 이때 보호하고자 하는 데이터 자산에 적용되는 개인정보보호 법령 및 관련 규제 기준으로 요구사항을 도출한다. * 조직의 위험 수용 수준에 맞춰, 가능성과 영향도 기준을 표준화한 [통합 위험 평가 모델](https://owasp.org/www-community/OWASP_Risk_Rating_Methodology)을 수립한다. @@ -24,7 +24,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 ### 2. 탄탄한 기반을 통한 실행 체계 확보 -* 모든 개발 조직이 준수할 애플리케이션 보안 최소 기준을 맞추기 위한 정책 및 표준을 수립한다. +* 모든 개발 조직이 준수할 애플리케이션 보안 최소 기준을 위한 정책 및 표준을 수립한다. * 수립한 정책 및 표준을 따를 수 있도록 재사용 가능한 공통 보안 통제를 정의하고 설계 및 개발 지침을 함께 제공한다. @@ -39,19 +39,18 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 개발 및 프로젝트 팀이 각 활동을 성공적으로 수행할 수 있도록 주제별 분야 전문가(subject matter expert)와 지원 서비스를 제공한다. -* 현행 시스템 개발 수명 주기(system development life cycle, SDLC)와 모든 소프트웨어 보안 활동, 도구, 정책, 프로세스를 검토한 후 이를 문서화한다. +* 현행 시스템 개발 수명 주기(system development life cycle)와 모든 소프트웨어 보안 활동, 도구, 정책, 프로세스를 검토한 후 이를 문서화한다. -* 신규 소프트웨어의 경우, 시스템 개발 생명주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서는 수행 가능한 다양한 제안을 제공한다. 이러한 신규 활동을 모든 신규 프로젝트 또는 소프트웨어 이니셔티브에 대해 수행하도록 보장한다. 이를 통해 각 신규 소프트웨어가 조직에 허용 가능한 보안 상태(security posture)로 제공(납품)됨을 알 수 있다. * 새로운 소프트웨어 개발 시에는 시스템 개발 생명주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서 수행 가능한 다양한 활동을 제시한다. 제시된 활동을 수행하여 모든 새로운 프로젝트 또는 소프트웨어에 조직의 요구 사항에 부합하는 보안 수준이 제공되도록 한다. * 최종 산출물이 조직의 수용 가능한 위험 수준을 만족하도록 활동을 선정한다. -* 기존(때로는 레거시라고 함)의 소프트웨어의 경우 유지관리 계획을 수립한다. 안전한 애플리케이션을 유지하는 방법은 아래의 운영 및 변경 관리 섹션을 참고한다. +* 기존(때로는 레거시라고 함)의 소프트웨어의 경우 유지관리 계획을 수립한다. 안전한 애플리케이션을 유지하는 방법은 아래의 '운영 및 변경 관리' 섹션을 참고한다. ### 4. 애플리케이션 보안 교육 -* 개발 조직의 보안 역량 강화를 위해 보안 챔피언(Security Champion) 제도 또는 개발자 대상 보안 교육 프로그램(보안 인식 프로그램이라고 부르기도 함)을 도입하는 방안을 검토한다. 이를 통해 개발자에게 필요한 지식을 교육할 수 있다. 이를 통해 개발자가 최신 보안 지식을 지속적으로 습득하고, 안전한 방식으로 업무를 수행할 수 있도록 지원하며, 조직 내 보안 문화를 보다 긍정적으로 만든다. 또한 보안팀과의 신뢰를 향상시키고 더 만족스러운 협업 관계를 형성할 수 있다. 관련 가이드는 [OWASP 보안 챔피언 가이드](https://securitychampions.owasp.org/)를 참고하며, 해당 가이드는 단계적으로 보강되고 있다. +* 개발 조직의 보안 역량 강화를 위해 보안 챔피언(Security Champion) 제도 또는 개발자 대상 보안 교육 프로그램(보안 인식 프로그램이라고 부르기도 함)을 도입하는 방안을 검토한다. 이를 통해 개발자에게 필요한 지식을 교육할 수 있다. 이를 통해 개발자가 최신 보안 지식을 지속적으로 습득하고, 업무를 수행할 때 안전해질 수 있도록 지원하며, 보안 문화를 더욱 긍정적으로 만든다. 이는, 보안팀과의 신뢰를 향상하고 더 만족스러운 협업 관계를 형성할 수 있다. 관련 가이드는 [OWASP 보안 챔피언 가이드](https://securitychampions.owasp.org/)를 참고하며, 해당 가이드는 단계적으로 보강되고 있다. * OWASP 교육 프로젝트는 개발자에게 웹 애플리케이션 보안을 교육하는 데 필요한 교육 자료를 제공한다. 취약점에 대한 실습 중심 학습을 위해 [OWASP Juice Shop Project](https://owasp.org/www-project-juice-shop/) 또는 [OWASP WebGoat](https://owasp.org/www-project-webgoat/)를 활용한다. 최신 동향을 유지하기 위해 [OWASP AppSec 컨퍼런스](https://owasp.org/events/), [OWASP 컨퍼런스 트레이닝](https://owasp.org/events/), 또는 지역 [OWASP Chapter](https://owasp.org/chapters/) 모임에 참여한다. From 9fd69384c5b8ae8f10577ce1bafa6ccf60036f8c Mon Sep 17 00:00:00 2001 From: ni5am Date: Fri, 2 Jan 2026 01:11:34 +0900 Subject: [PATCH 048/167] Complete translation of all content --- ...g_a_Modern_Application_Security_Program.md | 2 +- ...g_a_Modern_Application_Security_Program.md | 205 +++++++++--------- 2 files changed, 102 insertions(+), 105 deletions(-) diff --git a/2025/docs/en/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/en/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 7ae94c703..c5540c269 100644 --- a/2025/docs/en/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/en/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -68,7 +68,7 @@ If you are starting a program from scratch, or you find OWASP SAMM or DSOMM ‘t ### Requirements and Resource Management Phase: -* Collect and negotiate the business requirements for an application with the business, including the protection requirements with regard to confidentiality, authenticity, integrity and availability of all data assets, and the expected business logic. +* Collect and negotiate the business requirements for an application with the business, and the expected business logic. * Compile the technical requirements including functional and nonfunctional security requirements. OWASP recommends you use the [OWASP Application Security Verification Standard (ASVS)(https://owasp.org/www-project-application-security-verification-standard/) as a guide for setting the security requirements for your application(s). diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 3cb032f62..a5401c89b 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -4,7 +4,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 -이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP SAMM(Software Assurance Maturity Model)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려하라. 해당 모델들은 포괄적이며 세부 항목까지 망라하고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야만 보안을 제대로 하고 있다고 볼 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. +이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려하라. 해당 모델들은 포괄적이며 세부 항목까지 망라하고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야만 보안을 제대로 하고 있다고 볼 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. @@ -52,7 +52,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 개발 조직의 보안 역량 강화를 위해 보안 챔피언(Security Champion) 제도 또는 개발자 대상 보안 교육 프로그램(보안 인식 프로그램이라고 부르기도 함)을 도입하는 방안을 검토한다. 이를 통해 개발자에게 필요한 지식을 교육할 수 있다. 이를 통해 개발자가 최신 보안 지식을 지속적으로 습득하고, 업무를 수행할 때 안전해질 수 있도록 지원하며, 보안 문화를 더욱 긍정적으로 만든다. 이는, 보안팀과의 신뢰를 향상하고 더 만족스러운 협업 관계를 형성할 수 있다. 관련 가이드는 [OWASP 보안 챔피언 가이드](https://securitychampions.owasp.org/)를 참고하며, 해당 가이드는 단계적으로 보강되고 있다. -* OWASP 교육 프로젝트는 개발자에게 웹 애플리케이션 보안을 교육하는 데 필요한 교육 자료를 제공한다. 취약점에 대한 실습 중심 학습을 위해 [OWASP Juice Shop Project](https://owasp.org/www-project-juice-shop/) 또는 [OWASP WebGoat](https://owasp.org/www-project-webgoat/)를 활용한다. 최신 동향을 유지하기 위해 [OWASP AppSec 컨퍼런스](https://owasp.org/events/), [OWASP 컨퍼런스 트레이닝](https://owasp.org/events/), 또는 지역 [OWASP Chapter](https://owasp.org/chapters/) 모임에 참여한다. +* OWASP 교육 프로젝트는 개발자에게 웹 애플리케이션 보안을 교육하는 데 필요한 교육 자료를 제공한다. 취약점에 대한 실습 중심 학습을 위해 [OWASP Juice Shop 프로젝트](https://owasp.org/www-project-juice-shop/) 또는 [OWASP WebGoat](https://owasp.org/www-project-webgoat/)를 활용한다. 최신 동향을 유지하기 위해 [OWASP AppSec 컨퍼런스](https://owasp.org/events/), [OWASP 컨퍼런스 트레이닝](https://owasp.org/events/), 또는 지역 [OWASP Chapter](https://owasp.org/chapters/) 모임에 참여한다. ### 5. 지표 가시성 확보 @@ -62,244 +62,241 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 구현 및 검증 활동에서 축적된 데이터를 분석하여, 근본 원인(root cause)과 취약점 패턴을 식별하고, 전사 차원의 전략 및 시스템적 개선을 추진한다. 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공한다. -## Establish & Use Repeatable Security Processes and Standard Security Controls +## 반복 가능한 보안 프로세스 및 표준 보안 통제 수립 및 적용 -### Requirements and Resource Management Phase: +### 요구사항 및 리소스 관리 단계 -* Collect and negotiate the business requirements for an application with the business, including the protection requirements with regard to confidentiality, authenticity, integrity and availability of all data assets, and the expected business logic. +* 비즈니스 부서와 함께 애플리케이션의 비즈니스 요구사항을 수집하고 조율한다. 이 요구사항은 모든 데이터 자산에 대한 기밀성, 인증성, 무결성, 가용성 관점의 보호 요구사항과, 기대되는 비즈니스 로직이 포함된다. -* Compile the technical requirements including functional and nonfunctional security requirements. OWASP recommends you use the [OWASP Application Security Verification Standard (ASVS)(https://owasp.org/www-project-application-security-verification-standard/) as a guide for setting the security requirements for your application(s). +* 기능/비기능적 보안 요구사항을 포함하여 기술 요구사항을 취합한다. OWASP는 애플리케이션의 보안 요구사항을 설정하기 위한 가이드로 [OWASP 애플리케이션 보안 검증 표준(Application Security Verification Standard, ASVS)](https://owasp.org/www-project-application-security-verification-standard/)를 활용을 권고한다. -* Plan and negotiate the budget that covers all aspects of design, build, testing and operation, including security activities. +* 보안 활동을 포함하여 설계, 구축, 테스트, 운영의 모든 측면을 포괄하는 예산을 계획하고 조율한다. -* Add security activities to your project schedule. +* 프로젝트 일정에 보안 활동을 명시적으로 편성한다. -* Introduce yourself as the security representative at the project kick off, so they know who to talk to. +* 프로젝트 킥오프에서 보안 담당을 지정하여, 관련자가 누구와 소통해야 하는지 알 수 있도록 한다. +### 제안요청서(RFP) 및 합의 단계 -### Request for Proposals (RFP) and Contracting: - +* 내외부 개발자와 요구사항을 사전에 합의하며, 조직의 보안 체계(예: SDLC 적용, 보안 모범사례 준수)에 부합하는 가이드라인과 및 보안 요구사항을 포함한다. * Negotiate the requirements with internal or external developers, including guidelines and security requirements with respect to your security program, e.g. SDLC, best practices. -* Rate the fulfillment of all technical requirements, including a planning and design phase. - -* Negotiate all technical requirements, including design, security, and service level agreements (SLA). - -* Adopt templates and checklists, such as [OWASP Secure Software Contract Annex](https://owasp.org/www-community/OWASP_Secure_Software_Contract_Annex).
**Note:** *The annex is for US contract law, so please consult qualified legal advice before using the sample annex.* +* 기획 및 설계 단계를 포함하여, 모든 기술 요구사항의 충족 여부를 평가한다. +* 설계, 보안, 서비스 수준 계약(service level agreements, SLA)을 포함하여 모든 기술 요구사항을 협의한다. -### Planning and Design Phase: +* [OWASP 보안 소프트웨어 계약 부록](https://owasp.org/www-community/OWASP_Secure_Software_Contract_Annex)와 같은 템플릿 및 체크리스트를 적용한다. +
**참고:** *해당 문서는 미국 계약법을 전제로 하므로, 해당 문서를 사용하기 전에 자격을 갖춘자에 의해 법률 자문을 구한다.* -* Negotiate planning and design with the developers and internal shareholders, e.g. security specialists. -* Define the security architecture, controls, countermeasures and design reviews appropriate to the protection needs and the expected threat level. This should be supported by security specialists. +### 기획 및 설계 단계 -* Rather than retrofitting security into your applications and APIs, it is far more cost effective to design the security in from the start. OWASP recommends the [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/index.html) and the [OWASP Proactive Controls](https://top10proactive.owasp.org/) as a good starting point for guidance on how to design security included from the beginning. +* 개발자 및 내부 이해관계자(예: 보안 전문가)와 기획 및 설계를 협의한다. -* Perform threat modelling, see [OWASP Cheat Sheet: Threat Modeling](https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html). +* 보호 요구사항과 예상 위협 수준에 적합한 보안 아키텍처, 통제, 대책 및 설계 검토를 정의한다. 이는 보안 전문가의 지원을 받아야 한다. -* Teach your software architects secure design concepts and patterns and ask them to add them to their designs where possible. +* 애플리케이션 및 API가 개발된 이후에 보안을 추가하는 것보다, 시작 단계부터 보안을 설계에 포함하는 것이 비용 효율성이 훨씬 높다. 보안을 초기부터 내재화하는 출발점으로 [OWASP 치트 시트](https://cheatsheetseries.owasp.org/index.html) 및 [OWASP 사전 예방 통제](https://top10proactive.owasp.org/) 사용을 권고한다. -* Examine data flows with your developers. +* 위협 모델링(threat modelling)을 수행한다. 자세한 사항은 [OWASP 치트 시트: 위협 모델링](https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html)을 참고한다. -* Add security user stories alongside all of your other user stories. +* 소프트웨어 아키텍트에게 안전한 설계 개념과 패턴을 교육하고, 가능할 경우 설계에 이를 반영하도록 요청한다. +* 개발자와 함께 데이터 흐름(data flow)을 검토한다. -### Secure Development Lifecycle: +* 기존 사용자 스토리(user story)에 보안 사용자 스토리를 추가한다. -* To improve the process your organization follows when building applications and APIs, OWASP recommends the [OWASP Software Assurance Maturity Model (SAMM)](https://owasp.org/www-project-samm/). This model helps organizations formulate and implement a strategy for software security that is tailored to the specific risks facing their organization. +### 안전한 개발 생명주기(Secure Development Lifecycle) -* Provide secure coding training to your software developers, and any other training you think will help them create more robust and secure applications. +* 조직이 애플리케이션 및 API를 구축할 때 따르는 프로세스를 개선하기 위해, [OWASP 소프트웨어 보증 성숙도 모델(SAMM)](https://owasp.org/www-project-samm/)을 권장한다. 이 모델은 조직이 직면한 특정 위험에 맞춘 소프트웨어 보안 전략을 수립하고 구현하는 데 도움이 됩니다. -* Code review, see [OWASP Cheat Sheet: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html). +* 소프트웨어 개발자에게 시큐어 코딩 교육을 제공하고, 보다 견고하고 안전한 애플리케이션을 만들도록 지원하는 데 도움이 된다고 판단되는 기타 교육도 제공한다. -* Give your developers security tools, then teach them how to use them, especially static analysis, software composition analysis, secret, and [Infrastructure-as-Code (IaC)](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) scanners. +* 코드 리뷰를 수행한다. [OWASP 치트 시트: 시큐어 코드 리뷰](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html)을 참고한다. -* Create guardrails for your developers, if possible (technical safeguards to steer them towards more secure choices). +* 개발자에게 보안 도구를 제공하고 사용 방법을 교육한다. 특히 정적 분석(static analysis), 소프트웨어 구성 분석(software composition analysis, SCA), 시크릿 및 [코드형 인프라(Infrastructure-as-Code, IaC)](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) 스캐너 도구를 포함한다. -* Building strong and usable security controls is difficult. Offer secure defaults whenever possible, and create ‘paved roads’ (making the easiest way also the most secure way to do something, the obvious preferred way) whenever possible. The [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/index.html) are a good starting point for developers, and many modern frameworks now come with standard and effective security controls for authorization, validation, CSRF prevention, etc. +* 개발자가 보안상 안전한 선택을 기본으로 하도록, 가드레일을 적용한다. -* Give your developers security-related IDE plugins and encourage them to use them. +* 강력하면서도 사용 가능한 보안 통제를 구축하는 것은 어렵다. 가능한 경우 안전한 기본값을 제공하고, 가능한 경우 '포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것)'를 만든다. [OWASP 치트 시트](https://cheatsheetseries.owasp.org/index.html)는 개발자에게 좋은 출발점이며, 많은 현대적 프레임워크는 인가(authorization), 검증(validation), 교차 사이트 요청 위조(CSRF) 방지 등과 관련한 표준적이고 효과적인 보안 통제를 제공한다. -* Provide them a secret management tool, licenses, and documentation on how to use it. +* 개발자에게 보안 관련 IDE 플러그인을 제공하고 사용을 권장한다. -* Provide them a private AI to use, ideally set up with a RAG server full of useful security documentation, prompts your team has written for better outcomes, and an MCP server that calls the security tooling of choice for your org. Teach them how to use AI safely, because they are going to do it whether you like it or not. +* 시크릿 관리 도구, 라이선스, 그리고 사용 방법에 대한 문서를 제공한다. +* 개발자가 사용할 수 있는 프라이빗 AI를 제공한다. 이상적으로는 유용한 보안 문서로 채워진 RAG 서버, 더 나은 결과를 위해 팀이 작성한 프롬프트, 그리고 조직에서 선택한 보안 도구를 호출하는 MCP 서버로 구성되도록 설정한다. 또한 개발자에게 AI를 안전하게 사용하는 방법을 교육한다. 개발자는 보안팀의 선호도와 무관하게 AI를 사용할 것이기 때문이다. -### Establish Continuous Application Security Testing: +### 지속적 애플리케이션 보안 테스트 체계 구축 -* Test the technical functions and integration with the IT architecture and coordinate business tests. +* 애플리케이션의 기술적 기능과 IT 아키텍처와의 연동되는 부분을 테스트하고, 비즈니스 테스트와 문제가 없도록 조율한다. -* Create “use” and “abuse” test cases from technical and business perspectives. +* 기술 및 비즈니스 관점에서 "정상" 및 "어뷰징" 테스트 케이스를 생성한다. -* Manage security tests according to internal processes, the protection needs, and the assumed threat level by the application. +* 내부 프로세스, 보호 요구 사항 및 애플리케이션의 예상 위협 수준에 따라 보안 테스트를 관리합니다. -* Provide security testing tools (fuzzers, DAST, etc.), a safe place to test, and training on how to use them, OR do the testing for them OR hire a tester +* 개발팀이 사용할 보안 테스트 도구(퍼저, 동적 애플리케이션 보안 테스트 등)와 안전한 테스트 환경, 사용 교육을 제공한다. 또는 개발팀을 대신해 테스트를 수행하거나 테스터를 투입한다. -* If you require a high level of assurance, consider a formal penetration test, as well as stress testing and performance testing. +* 높은 수준의 보증(assurance)이 필요한 경우, 공식 침투 테스트와 함께 스트레스 테스트 및 성능 테스트를 고려한다. -* Work with your developers to help them decide what they need to fix from the bug reports, and ensure their managers give them time to do it. +* 개발자와 협업하여 버그 리포트에서 어떤 내용을 수정해야 하는지 가이드하고, 그들의 관리자와 협의해 수정 시간을 일정에 확보할 수 있도록 한다. -### Rollout: +### 배포 -* Put the application in operation and migrate from previously used applications if needed. +* 애플리케이션을 운영환경에 배포하고, 필요요 시 기존 시스템에서 신규 시스템으로 마이그레이션을 수행한다. -* Finalize all documentation, including the change management database (CMDB) and security architecture. +* 구성 관리 데이터베이스와 보안 아키텍처를 포함한 모든 문서를 최종 확정한다. ### 운영 및 변경 관리 -* Operations must include guidelines for the security management of the application (e.g. patch management). +* 운영시 애플리케이션의 보안 관리를 위한 가이드라인(예: 패치 관리)이 포함되어야 한다. -* Raise the security awareness of users and manage conflicts about usability vs. security. +* 사용자의 보안 인식을 제고하고, 사용성과 보안성 간의 문제를 관리한다. -* Plan and manage changes, e.g. migrate to new versions of the application or other components like OS, middleware, and libraries. +* 변경(changes)을 계획하고 관리한다. 예를 들어 애플리케이션의 신규 버전 또는 OS, 미들웨어, 라이브러리와 같은 기타 구성요소로의 버전 업데이트를 포함한다. -* Ensure all apps are in your inventory, with all important details documented. Update all documentation, including in the CMDB and the security architecture, controls, and countermeasures, including any runbooks or project documentation. +* 모든 애플리케이션이 인벤토리에 등록되어 있으며, 모든 중요 세부사항이 문서화되어 있음을 보장한다. 구성 관리 데이터베이스 및 보안 아키텍처, 통제항목, 대응방안, 런북(runbook) 또는 프로젝트 문서 포함을 포함한 모든 문서를 최신 상태로 유지한다. -* Perform logging, monitoring, and alerting for all apps. Add it if it’s missing. +* 모든 애플리케이션에 대해 로깅, 모니터링, 알림(alert)를 수행한다. 누락된 경우 추가한다. -* Create processes for effective and efficient updating and patching. +* 효과적이고 효율적인 업데이트 및 패치를 위한 프로세스를 수립한다. -* Create regular scanning schedules (hopefully dynamic, static, secrets, IaC, and software composition analysis). +* 정기 스캐닝 일정(가능하면 동적, 정적, 시크릿, IaC, 소프트웨어 구성 분석)을 수립한다. -* SLAs for fixing security bugs. +* 보안 버그 수정에 대한 SLA를 수립한다. -* Provide a way for employees (and ideally also your customers) to report bugs. +* 임직원(가능하면 고객도 포함)이 버그를 신고할 수 있는 방법을 제공한다. -* Establish a trained incident response team that understands what software attacks look like, observability tooling. +* 소프트웨어 공격과 옵저버빌리티(observability) 도구를 이해하는, 훈련된 침해사고 대응팀을 구성한다. -* Run blocking or shielding tools to stop automated attacks. +* 자동화 공격을 차단하기 위한 차단 또는 방어하는 도구를 운영한다. -* Annual (or more often) hardening of configurations. +* 설정에 대한 연 1회(또는 그 이상) 하드닝을 수행한다. -* At least annual penetration testing (depending upon the level assurance required for your app). +* 애플리케이션에 요구되는 보증 수준에 따라, 최소 연 1회 침투 테스트를 수행한다. -* Establish processes and tooling for hardening and protecting your software supply chain. +* 소프트웨어 공급망을 하드닝하고 보호하기 위한 프로세스 및 도구를 수립한다. -* Establish and update business continuity and disaster recovery planning that includes your most important applications and the tools you use to maintain them. +* 비즈니스 연속성 계획(BCP) 및 재해복구(DR) 계획을 수립하고 정기적으로 갱신한다. 해당 계획에는 핵심 애플리케이션과 이를 유지관리하는 데 사용하는 도구를 포함해야 한다. +### 시스템 폐기 -### Retiring Systems: +* 필요한 데이터는 아카이빙해야 한다. 그 외 모든 데이터는 완전 삭제해야 한다. -* Any required data should be archived. All other data should be securely wiped. +* 미사용 계정(account), 역할(role), 권한(permission) 삭제를 포함하여 애플리케이션을 안전하게 폐기 처리한다. -* Securely retire the application, including deleting unused accounts and roles and permissions. +* 구성 관리 데이터베이스 애플리케이션 상태를 폐기 변경한다. -* Set your application’s state to retired in the CMDB. +## OWASP Top 10의 표준 활용 가이드 -## Using the OWASP Top 10 as a standard +OWASP Top 10은 주로 인식 제고 문서이다. 그러나 이는 2003년 처음 발표된 이후로 조직들이 이를 사실상(de facto) 업계 애플리케이션 보안 표준으로 사용해 온 상황을 막지 못했다. OWASP Top 10을 코딩 또는 테스트 표준으로 사용하려는 경우, 이것이 최소 수준의 베이스라인이며 단지 출발점에 불과하다는 점을 인지해야 한다. -The OWASP Top 10 is primarily an awareness document. However, this has not stopped organizations from using it as a de facto industry AppSec standard since its inception in 2003. If you want to use the OWASP Top 10 as a coding or testing standard, know that it is the bare minimum and just a starting point. +OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리케이션 보안 위험을 문서화 한 것이며, 쉽게 테스트 가능한 위험을 다루는 것은 아니라는 점이다. 예를 들어 [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)은 대부분의 테스트하기 어렵다. 또 다른 예로, 로깅 및 모니터링이 실제로, 사용 중이며 효과적으로 구현되었는지 여부를 테스트하는 것은 인터뷰와 사고 대응 사례 샘플링하는 방식으로만 가능하다. 정적 코드 분석 도구는 로깅 부재를 탐지할 수 있으나, 비즈니스 로직 또는 접근 통제가 위험한 보안 사고를 로깅하는지 여부를 판단하는 것은 불가능할 수 있다. 침투 테스트 역시 테스트 환경에서의 탐지/대응 확인에 그칠 수 있으며, 테스트 환경은 운영 환경과 동일한 수준이 아닌 않는 경우가 많다. -One of the difficulties of using the OWASP Top 10 as a standard is that we document AppSec risks, and not necessarily easily testable issues. For example, [A06:2025-Insecure Design](A06_2025-Insecure_Design.md) is beyond the scope of most forms of testing. Another example is testing whether in-place, in-use, and effective logging and monitoring are implemented, which can only be done with interviews and requesting a sampling of effective incident responses. A static code analysis tool can look for the absence of logging, but it might be impossible to determine if business logic or access control is logging critical security breaches. Penetration testers may only be able to determine that they have invoked incident response in a test environment, which is rarely monitored in the same way as production. - -Here are our recommendations for when it is appropriate to use the OWASP Top 10: +아래는 OWASP Top 10을 표준으로 활용하기에 적절한 상황에 대한 권고사항이다:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Use Case + 사용 사례 OWASP Top 10 2025 OWASP Application Security Verification Standard + OWASP 애플리케이션 보안 검증 표준
Awareness + 인식 제고 Yes +
Training + 교육 Entry level + 입문 수준 Comprehensive + 포괄적인
Design and architecture + 설계와 아키텍처 Occasionally + 드물게 Yes +
Coding standard + 코딩 표준 Bare minimum + 기본적인 Yes +
Secure Code review + 보안 코드 리뷰 Bare minimum + 기본적인 Yes +
Peer review checklist + 피어 리뷰(peer review) 체크리스트 Bare minimum + 기본적인 Yes +
Unit testing + 유닛 테스트 Occasionally + 드물게 Yes +
Integration testing + 통합 테스트 Occasionally + 드물게 Yes +
Penetration testing + 침투 테스트 Bare minimum + 기본적인 Yes +
Tool support Bare minimum + 기본적인 Yes +
Secure Supply Chain + 안전한 공급망 Occasionally + 드물게 Yes +
+애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능 하게 정의하도록 설계되었고 보안 안전한 안전한 개발 주기(SDL) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)]((https://owasp.org/www-project-application-security-verification-standard/))를 기준으로 활용하는 것을 권고한다. -We would encourage anyone wanting to adopt an application security standard to use the [OWASP Application Security Verification Standard](https://owasp.org/www-project-application-security-verification-standard/) (ASVS), as it’s designed to be verifiable and tested, and can be used in all parts of a secure development lifecycle. - -The ASVS is the only acceptable choice for tool vendors. Tools cannot comprehensively detect, test, or protect against the OWASP Top 10 due to the nature of several of the OWASP Top 10 risks, with reference to [A06:2025-Insecure Design](A06_2025-Insecure_Design.md). OWASP discourages any claims of full coverage of the OWASP Top 10, because it’s simply untrue. +특히 보안 도구 벤더 관점에서는 ASVS를 기준으로 삼는 것이 유일한 선택지이다. OWASP Top 10은 위험 중심으로 구성되어 있기에, [A06:2025 - Insecure Design](A06_2025-Insecure_Design.md) 사례와 마찬가지로 자동화 도구만으로 모든 Top 10 항목을 포괄적으로 탐지, 테스트, 방어하기 어렵다. 따라서, OWASP는 Top 10을 전부 보장한다는 주장을 지양하도록 안내한다. From 25d32c0e1e646eb01b0c00eaadc1bdfcc9f2e73a Mon Sep 17 00:00:00 2001 From: ni5am Date: Fri, 2 Jan 2026 01:12:07 +0900 Subject: [PATCH 049/167] revert --- ...3_2025-Establishing_a_Modern_Application_Security_Program.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/en/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/en/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index c5540c269..7ae94c703 100644 --- a/2025/docs/en/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/en/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -68,7 +68,7 @@ If you are starting a program from scratch, or you find OWASP SAMM or DSOMM ‘t ### Requirements and Resource Management Phase: -* Collect and negotiate the business requirements for an application with the business, and the expected business logic. +* Collect and negotiate the business requirements for an application with the business, including the protection requirements with regard to confidentiality, authenticity, integrity and availability of all data assets, and the expected business logic. * Compile the technical requirements including functional and nonfunctional security requirements. OWASP recommends you use the [OWASP Application Security Verification Standard (ASVS)(https://owasp.org/www-project-application-security-verification-standard/) as a guide for setting the security requirements for your application(s). From 16187378d91e1c13373f0b126f453bf37ef3c3c9 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Fri, 2 Jan 2026 13:12:32 +0900 Subject: [PATCH 050/167] Reflected review messages --- .../ko/A02_2025-Security_Misconfiguration.md | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index 5ab780db4..cb1510b7c 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -1,9 +1,9 @@ -# A02:2025 잘못된 보안 설정 ![icon](../assets/TOP_10_Icons_Final_Security_Misconfiguration.png){: style="height:80px;width:80px" align="right"} +# A02:2025 보안 설정 오류 ![icon](../assets/TOP_10_Icons_Final_Security_Misconfiguration.png){: style="height:80px;width:80px" align="right"} ## 배경. -지난 버전에서부터 5위로 올라왔으며, 테스트된 모든 애플리케이션에서 어떠한 형태의 잘못된 보안 설정이 발견되었다. 이번 카테고리 내에서의 평균 사고 발생률은 3% 이며, 71만 9천(719k)개가 넘는 CWE가 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 `CWE-16: 설정` 그리고 `CWE-611: 부적절한 XML 외부 엔티티 참조 제한(XXE)`이 있다. +지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트된 모든 애플리케이션에서 잘못된 설정 중 한가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 취약점 발생률은 3% 이며, 총 CWE는 1,375개이고 71만 9천(719k)개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 `CWE-16: 설정` 그리고 `CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)`가 있다. ## 점수표. @@ -56,48 +56,47 @@ ## 설명. -잘못된 보안 설정은 보안 관점에서 시스템, 애플리케이션, 클라우드 서비스 설정이 잘못되어 취약점이 발생하는 것을 말한다. +보안 설정 오류은 보안 관점에서 시스템, 애플리케이션, 클라우드 서비스 설정이 잘못되어 취약점이 발생하는 것을 말한다. 다음과 같은 경우 애플리케이션은 취약할 수 있다. -* 애플리케이션 스택 부분 또는 클라우드 서비스 내 부적절한 권한 설정에 적절한 보안대책이 없는 경우. -* 불필요한 기능이 활성화 또는 설치된 경우. (예시. 불필요 포트, 서비스, 페이지, 계정, 테스트 프레임워크 또는 권한) +* 애플리케이션 스택 전반에 적절한 보안 하드닝이 적용되지 않았거니, 클라우드 서비스 내 보안 설정이 잘못 구성되어 있는 경우. +* 불필요한 기능이 활성화 또는 설치된 경우. (예: 불필요 포트, 서비스, 페이지, 계정, 테스트 프레임워크 또는 권한) * 기본 계정, 패스워드가 활성화되어 있거나 변경되지 않은 경우 -* 과도한 에러메시지를 처리할 약한 중앙 설정으로 에러 처리 과정을 통해 스택 추적(Stack trace)이나 과도한 에러 정보 메시지가 사용자에게 전달되는 경우. +* 과도한 에러메시지를 처리할 공통 설정이 부족하여 에러 처리 과정에서 스택 트레이스(Stack trace)나 과도한 에러 정보 메시지가 사용자에게 전달되는 경우. * 업그레이드된 시스템에서 최신 보안 기능이 비활성화 되어 있거나 안전하게 설정되지 않은 경우. * 이전 버전과의 호환성을 우선시하여 안전하지 않은 설정을 하는 경우. -* 애플리케이션 서버 내 보안 설정, 애플리케이션 프레임워크(예시. 스트럿츠(Struts), 스프링(Spring), ASP.NET), 라이브러리, 데이터베이스 등에서 보안 설정이 되지 않은 경우. -* 서버가 보안 헤더 또는 지시자를 전달하지 않거나 보안 값이 설정되지 않은 경우. +* 애플리케이션 서버 내 보안 설정, 애플리케이션 프레임워크(예: 스트럿츠(Struts), 스프링(Spring), ASP.NET), 라이브러리, 데이터베이스 등에서 보안 설정이 되지 않은 경우. +* 서버가 보안 헤더 또는 지시문을 전달하지 않거나 안전하지 않은 설정 값으로 전달되는 경우. -일관되고 반복 가능한 애플리케이션 보안설정 강화 절차가 없다면 시스템은 위험한 상태에 있다. +일관되고 재사용 애플리케이션 보안 설정 하드닝 절차가 없다면 시스템은 더 높은 위험에 놓인다. -## 방어. +## 대응 방안. -보안성이 강구된 설치 프로세스는 다음 항목들을 포함하여 구현한다. +다음과 같은 항목들을 포함하여 보안성이 반영된 구성 절차를 수립한다. -* 반복 가능한 보안 강화 프로세스는 적절하게 보안 설정이된 다른 환경에 빠르고 쉽게 배포 가능해야 한다. 개발, 품질 보증(QA), 그리고 프로덕션 환경은 모두 동일한 구성으로 설정하며, 각각의 환경에서 서로 다른 자격증명을 사용한다. 해당 프로세스는 자동화되어 요구되는 새로운 보안환경을 구성하는 데 필요한 노력을 최소화 한다. +* 재사용 가능한 하드닝 프로세스를 구축하여 필요한 보안 통제가 적용된 동일한 형태의 신규 환경을 빠르고 쉽게 배포 가능해야 한다. 개발, QA, 운영 환경은 모두 동일한 구성으로 설정하며, 각각의 환경에서 서로 다른 자격증명을 사용한다. 이 프로세스는 자동화하여 요구되는 새로운 보안환경을 구성하는 데 필요한 노력을 최소화한다. * 사용하지 않은 기능, 컴포넌트, 문서, 샘플을 포함하지 않는 최소한의 플랫폼을 구현한다. 사용하지 않는 기능과 프레임워크는 삭제하거나 설치되지 않아야 한다. -* 패치 관리 프로세스의 일부로써 모든 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트를 한다.(참고. [A03 소프트웨어 공급망 체인 실패](A03_2025-Software_Supply_Chain_Failures.md)) 클라우드 스토리지 권한을 점검한다.(예시. S3 버킷 권한) -* 분리된 애플리케이션 아키텍처는 분리화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 컴포넌트와 테넌트 간 효과성과 보안성을 보장한다. -* 보안 지시자를 클라이언트로 보내야 한다. (예시. 보안 헤더) -* 자동화된 프로세스로 모든 환경에서 해당 설정들의 효과성을 검증한다. -* 백업 수단로써 과도한 에러메시지를 저장할 수 있도록 중앙 설정을 사전 구성한다. -* 만약 이런 검증사항들이 자동화되지 않았다면, 최소한 매년 수동적으로 검증한다. -* 내장된 정적 키, 또는 코드, 설정 파일, 파이프 라인 내 자격증명 사용 대신 기반 플랫폼에서 제공하는 통합 식별 관리, 짧은 사용기간의 자격증명, 역할 기반 접근 매커니즘을 사용한다. +* 패치 관리 프로세스(참고: [A03 소프트웨어 공급망 체인 실패](A03_2025-Software_Supply_Chain_Failures.md)) 수행 시 모든 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트를 한다. 또한, 클라우드 스토리지 권한(예: S3 버킷 권한)을 점검한다. +* 구성 요소 간 또는 테넌트 간 효과적으로 격리할 수 있도록 세분화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 애플리케이션 아키텍쳐를 설계함으로써 효과적이고 안전한 분리 구조를 보장한다. +* 보안 지시문을 클라이언트로 보내야 한다. (예: 보안 헤더) +* 자동화된 프로세스를 구축하여 모든 환경에서 해당 설정들의 안전성을 검증한다. +* 만일의 경우를 대비해, 과도한 에러 메시지가 사용자에게 노출되지 않도록 공통 설정을 사전에 구성한다. +* 만약 이런 검증사항들이 자동화되지 않았다면, 최소한 매년 1회는 수동으로 검증한다. +* 코드, 설정 파일, 파이프 라인 내 정적인 키나 시크릿을 저장하는 대신 플랫폼에서 제공하는 아이덴티티 페더레이션, 단기 유효 자격 증명, 또는 역할 기반 접근 매커니즘을 사용한다. ## 공격 시나리오 예시. -**시나리오 1:** 프로덕션 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재한다고 알려져 있으며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인 한 뒤 시스템 장악이 가능하다. +**시나리오 1:** 운영 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재한다고 알려져 있으며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인 한 뒤 시스템 장악이 가능하다. **시나리오 2:** 서버에서 디렉토리 리스팅이 활성화 되었을 때 공격자는 단순하게 디렉토리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드 할 수 있고, 이런 클래스들을 디컴파일 하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. -**시나리오 3:** 사용자에게 반환되는 스택 추적(Stack trace) 같은 자세한 에러 메시지가 표시되도록 설정되어 있는 경우 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. +**시나리오 3:** 사용자에게 반환되는 스택 트레이스(Stack trace) 같은 자세한 에러 메시지가 표시되도록 설정되어 있는 경우 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. -**시나리오 #4:** 클라우드 서비스 제공자(Cloud service provider, CSP)는 기본적으로 인터넷에 공유 자원을 공개한다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. (예시. 민감한 정보가 퍼블릭으로 설정된 S3 버킷에 저장되어 있을 경우 누구나 접근할 수 있다.) -// A cloud service provider (CSP) defaults to having sharing permissions open to the Internet 부분을 공유 권한이 인터넷에 공개되어 있다. 가 아닌 CSP는 기본적으로 인터넷에 공유 자원을 공개한다. 로 해석했습니다. +**시나리오 4:** 클라우드 서비스 제공자(Cloud service provider, CSP)는 인터넷에 자원을 공유하는 권한이 기본 설정이다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. ## 참조. From d5f0d6f437fac77d61eb753386b05ad0b3940f97 Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Fri, 2 Jan 2026 16:57:44 +0900 Subject: [PATCH 051/167] typo --- 2025/docs/ko/A02_2025-Security_Misconfiguration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index cb1510b7c..7e1dfb2e6 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -70,7 +70,7 @@ * 애플리케이션 서버 내 보안 설정, 애플리케이션 프레임워크(예: 스트럿츠(Struts), 스프링(Spring), ASP.NET), 라이브러리, 데이터베이스 등에서 보안 설정이 되지 않은 경우. * 서버가 보안 헤더 또는 지시문을 전달하지 않거나 안전하지 않은 설정 값으로 전달되는 경우. -일관되고 재사용 애플리케이션 보안 설정 하드닝 절차가 없다면 시스템은 더 높은 위험에 놓인다. +일관되고 재사용 가능한 애플리케이션 보안 설정 하드닝 절차가 없다면 시스템은 더 높은 위험에 놓인다. ## 대응 방안. From 5b553d4124bb6690d623ff2073c3cc7d18ccea55 Mon Sep 17 00:00:00 2001 From: ni5am Date: Fri, 2 Jan 2026 23:08:31 +0900 Subject: [PATCH 052/167] Add A05 file to ko directory --- 2025/docs/ko/A05_2025-Injection.md | 209 +++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 2025/docs/ko/A05_2025-Injection.md diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md new file mode 100644 index 000000000..d72e4a3b4 --- /dev/null +++ b/2025/docs/ko/A05_2025-Injection.md @@ -0,0 +1,209 @@ +# A05:2025 Injection ![icon](../assets/TOP_10_Icons_Final_Injection.png){: style="height:80px;width:80px" align="right"} + +## Background. + +Injection falls two spots from #3 to #5 in the ranking, maintaining its position relative to A04:2025-Cryptographic Failures and A06:2025-Insecure Design. Injection is one of the most tested categories with 100% of applications tested for some form of injection. It had the greatest number of CVEs for any category, with 37 CWEs in this category. Injection includes Cross-site Scripting (high frequency/low impact) with more than 30k CVEs and SQL Injection (low frequency/high impact) with more than 14k CVEs. The massive number of reported CVEs for CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') brings down the average weighted impact of this category. + + +## Score table. + + + + + + + + + + + + + + + + + + + + + + + + + +
CWEs Mapped + Max Incidence Rate + Avg Incidence Rate + Max Coverage + Avg Coverage + Avg Weighted Exploit + Avg Weighted Impact + Total Occurrences + Total CVEs +
37 + 13.77% + 3.08% + 100.00% + 42.93% + 7.15 + 4.32 + 1,404,249 + 62,445 +
+ + + +## Description. + +An injection vulnerability is an application flaw that allows untrusted user input to be sent to an interpreter (e.g. a browser, database, the command line) and causes the interpreter to execute parts of that input as commands. + +An application is vulnerable to attack when: + +* User-supplied data is not validated, filtered, or sanitized by the application. +* Dynamic queries or non-parameterized calls without context-aware escaping are used directly in the interpreter. +* Unsanitized data is used within object-relational mapping (ORM) search parameters to extract additional, sensitive records. +* Potentially hostile data is directly used or concatenated. The SQL or command contains the structure and malicious data in dynamic queries, commands, or stored procedures. + +Some of the more common injections are SQL, NoSQL, OS command, Object Relational Mapping (ORM), LDAP, and Expression Language (EL) or Object Graph Navigation Library (OGNL) injection. The concept is identical among all interpreters. Detection is best achieved by a combination of source code review along with automated testing (including fuzzing) of all parameters, headers, URL, cookies, JSON, SOAP, and XML data inputs. The addition of static (SAST), dynamic (DAST), and interactive (IAST) application security testing tools into the CI/CD pipeline can also be helpful to identify injection flaws before production deployment. + +A related class of injection vulnerabilities has become common in LLMs. These are discussed separately in the [OWASP LLM Top 10](https://genai.owasp.org/llm-top-10/), specifically [LLM01:2025 Prompt Injection](https://genai.owasp.org/llmrisk/llm01-prompt-injection/). + + +## How to prevent. + +The best means to prevent injection requires keeping data separate from commands and queries: + +* The preferred option is to use a safe API, which avoids using the interpreter entirely, provides a parameterized interface, or migrates to Object Relational Mapping Tools (ORMs). +**Note:** Even when parameterized, stored procedures can still introduce SQL injection if PL/SQL or T-SQL concatenates queries and data or executes hostile data with EXECUTE IMMEDIATE or exec(). + +When it is not possible to separate the data from commands, you can reduce threats using the following techniques. + +* Use positive server-side input validation. This is not a complete defense as many applications require special characters, such as text areas or APIs for mobile applications. +* For any residual dynamic queries, escape special characters using the specific escape syntax for that interpreter. +**Note:** SQL structures such as table names, column names, and so on cannot be escaped, and thus user-supplied structure names are dangerous. This is a common issue in report-writing software. + +**Warning** these techniques involve parsing and escaping complex strings, making them error-prone and not robust in the face of minor changes to the underlying system. + +## Example attack scenarios. + +**Scenario #1:** An application uses untrusted data in the construction of the following vulnerable SQL call: + +``` +String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'"; +``` + +An attacker modifies the 'id' parameter value in their browser to send: `' OR '1'='1`. For example: + +``` +http://example.com/app/accountView?id=' OR '1'='1 +``` + +This changes the meaning of the query to return all records from the accounts table. More dangerous attacks could modify or delete data or even invoke stored procedures. + +**Scenario #2:** An application's blind trust in frameworks may result in queries that are still vulnerable. For example, Hibernate Query Language (HQL): + +``` +Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'"); +``` + +An attacker supplies: `' OR custID IS NOT NULL OR custID='`. This bypasses the filter and returns all accounts. While HQL has fewer dangerous functions than raw SQL, it still allows unauthorized data access when user input is concatenated into queries. + +**Scenario #3:** An application passes user input directly to an OS command: + +``` +String cmd = "nslookup " + request.getParameter("domain"); +Runtime.getRuntime().exec(cmd); +``` + +An attacker supplies `example.com; cat /etc/passwd` to execute arbitrary commands on the server. + +## References. + +* [OWASP Proactive Controls: Secure Database Access](https://owasp.org/www-project-proactive-controls/v3/en/c3-secure-database) +* [OWASP ASVS: V5 Input Validation and Encoding](https://owasp.org/www-project-application-security-verification-standard) +* [OWASP Testing Guide: SQL Injection,](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05-Testing_for_SQL_Injection) [Command Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/12-Testing_for_Command_Injection), and [ORM Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05.7-Testing_for_ORM_Injection) +* [OWASP Cheat Sheet: Injection Prevention](https://cheatsheetseries.owasp.org/cheatsheets/Injection_Prevention_Cheat_Sheet.html) +* [OWASP Cheat Sheet: SQL Injection Prevention](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html) +* [OWASP Cheat Sheet: Injection Prevention in Java](https://cheatsheetseries.owasp.org/cheatsheets/Injection_Prevention_Cheat_Sheet_in_Java.html) +* [OWASP Cheat Sheet: Query Parameterization](https://cheatsheetseries.owasp.org/cheatsheets/Query_Parameterization_Cheat_Sheet.html) +* [OWASP Automated Threats to Web Applications – OAT-014](https://owasp.org/www-project-automated-threats-to-web-applications/) +* [PortSwigger: Server-side template injection](https://portswigger.net/kb/issues/00101080_serversidetemplateinjection) +* [Awesome Fuzzing: a list of fuzzing resources](https://github.com/secfigo/Awesome-Fuzzing) + + + +## List of Mapped CWEs + +* [CWE-20 Improper Input Validation](https://cwe.mitre.org/data/definitions/20.html) + +* [CWE-74 Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')](https://cwe.mitre.org/data/definitions/74.html) + +* [CWE-76 Improper Neutralization of Equivalent Special Elements](https://cwe.mitre.org/data/definitions/76.html) + +* [CWE-77 Improper Neutralization of Special Elements used in a Command ('Command Injection')](https://cwe.mitre.org/data/definitions/77.html) + +* [CWE-78 Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')](https://cwe.mitre.org/data/definitions/78.html) + +* [CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')](https://cwe.mitre.org/data/definitions/79.html) + +* [CWE-80 Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)](https://cwe.mitre.org/data/definitions/80.html) + +* [CWE-83 Improper Neutralization of Script in Attributes in a Web Page](https://cwe.mitre.org/data/definitions/83.html) + +* [CWE-86 Improper Neutralization of Invalid Characters in Identifiers in Web Pages](https://cwe.mitre.org/data/definitions/86.html) + +* [CWE-88 Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')](https://cwe.mitre.org/data/definitions/88.html) + +* [CWE-89 Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')](https://cwe.mitre.org/data/definitions/89.html) + +* [CWE-90 Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection')](https://cwe.mitre.org/data/definitions/90.html) + +* [CWE-91 XML Injection (aka Blind XPath Injection)](https://cwe.mitre.org/data/definitions/91.html) + +* [CWE-93 Improper Neutralization of CRLF Sequences ('CRLF Injection')](https://cwe.mitre.org/data/definitions/93.html) + +* [CWE-94 Improper Control of Generation of Code ('Code Injection')](https://cwe.mitre.org/data/definitions/94.html) + +* [CWE-95 Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection')](https://cwe.mitre.org/data/definitions/95.html) + +* [CWE-96 Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection')](https://cwe.mitre.org/data/definitions/96.html) + +* [CWE-97 Improper Neutralization of Server-Side Includes (SSI) Within a Web Page](https://cwe.mitre.org/data/definitions/97.html) + +* [CWE-98 Improper Control of Filename for Include/Require Statement in PHP Program ('PHP Remote File Inclusion')](https://cwe.mitre.org/data/definitions/98.html) + +* [CWE-99 Improper Control of Resource Identifiers ('Resource Injection')](https://cwe.mitre.org/data/definitions/99.html) + +* [CWE-103 Struts: Incomplete validate() Method Definition](https://cwe.mitre.org/data/definitions/103.html) + +* [CWE-104 Struts: Form Bean Does Not Extend Validation Class](https://cwe.mitre.org/data/definitions/104.html) + +* [CWE-112 Missing XML Validation](https://cwe.mitre.org/data/definitions/112.html) + +* [CWE-113 Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Response Splitting')](https://cwe.mitre.org/data/definitions/113.html) + +* [CWE-114 Process Control](https://cwe.mitre.org/data/definitions/114.html) + +* [CWE-115 Misinterpretation of Output](https://cwe.mitre.org/data/definitions/115.html) + +* [CWE-116 Improper Encoding or Escaping of Output](https://cwe.mitre.org/data/definitions/116.html) + +* [CWE-129 Improper Validation of Array Index](https://cwe.mitre.org/data/definitions/129.html) + +* [CWE-159 Improper Handling of Invalid Use of Special Elements](https://cwe.mitre.org/data/definitions/159.html) + +* [CWE-470 Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')](https://cwe.mitre.org/data/definitions/470.html) + +* [CWE-493 Critical Public Variable Without Final Modifier](https://cwe.mitre.org/data/definitions/493.html) + +* [CWE-500 Public Static Field Not Marked Final](https://cwe.mitre.org/data/definitions/500.html) + +* [CWE-564 SQL Injection: Hibernate](https://cwe.mitre.org/data/definitions/564.html) + +* [CWE-610 Externally Controlled Reference to a Resource in Another Sphere](https://cwe.mitre.org/data/definitions/610.html) + +* [CWE-643 Improper Neutralization of Data within XPath Expressions ('XPath Injection')](https://cwe.mitre.org/data/definitions/643.html) + +* [CWE-644 Improper Neutralization of HTTP Headers for Scripting Syntax](https://cwe.mitre.org/data/definitions/644.html) + +* [CWE-917 Improper Neutralization of Special Elements used in an Expression Language Statement ('Expression Language Injection')](https://cwe.mitre.org/data/definitions/917.html) From 0bf0ac7de6aeec6e893ae1939713bd32d90df36d Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Fri, 2 Jan 2026 23:19:11 +0900 Subject: [PATCH 053/167] typo --- 2025/docs/ko/A02_2025-Security_Misconfiguration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index 7e1dfb2e6..d369424f1 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -21,9 +21,9 @@ 평균 테스트 커버리지 - 가중 평균 악용도 + 평균 가중 악용도 - 가중 평균 영향도 + 평균 가중 영향도 총 발생 건수 From e7a15e2c13bdaa92b85429ad4b30b2adb9e8a033 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sat, 3 Jan 2026 00:15:02 +0900 Subject: [PATCH 054/167] Translate A05:2025 Injection document to Korean --- 2025/docs/ko/A05_2025-Injection.md | 83 +++++++++++++++--------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index d72e4a3b4..4d955182c 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -1,32 +1,31 @@ -# A05:2025 Injection ![icon](../assets/TOP_10_Icons_Final_Injection.png){: style="height:80px;width:80px" align="right"} +# A05:2025 인젝션 ![icon](../assets/TOP_10_Icons_Final_Injection.png){: style="height:80px;width:80px" align="right"} -## Background. +## 배경. -Injection falls two spots from #3 to #5 in the ranking, maintaining its position relative to A04:2025-Cryptographic Failures and A06:2025-Insecure Design. Injection is one of the most tested categories with 100% of applications tested for some form of injection. It had the greatest number of CVEs for any category, with 37 CWEs in this category. Injection includes Cross-site Scripting (high frequency/low impact) with more than 30k CVEs and SQL Injection (low frequency/high impact) with more than 14k CVEs. The massive number of reported CVEs for CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') brings down the average weighted impact of this category. +인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화(크로스 사이트 스크립팅)에 대한 보고된 CVE 수가 매우 많아 이 범주의 평균 가중 영향도가 낮아졌다. - -## Score table. +## 점수표. - - - - - - - - - @@ -53,71 +52,71 @@ Injection falls two spots from #3 to #5 in the ranking, maintaining its position -## Description. +## 설명. -An injection vulnerability is an application flaw that allows untrusted user input to be sent to an interpreter (e.g. a browser, database, the command line) and causes the interpreter to execute parts of that input as commands. +인젝션 취약점은 신뢰할 수 없는 사용자 입력이 인터프리터(예: 브라우저, 데이터베이스, 커맨드 라인)로 전송되어 인터프리터가 해당 입력의 일부를 명령으로 실행하도록 허용하는 애플리케이션 결함이다. -An application is vulnerable to attack when: +다음과 같은 경우 인젝션 공격에 취약할 수 있다. -* User-supplied data is not validated, filtered, or sanitized by the application. -* Dynamic queries or non-parameterized calls without context-aware escaping are used directly in the interpreter. -* Unsanitized data is used within object-relational mapping (ORM) search parameters to extract additional, sensitive records. -* Potentially hostile data is directly used or concatenated. The SQL or command contains the structure and malicious data in dynamic queries, commands, or stored procedures. +* 사용자가 제공한 데이터가 애플리케이션에 의해 검증, 필터링 또는 새니타이징되지 않는 경우. +* 동적 쿼리 또는 파라미터 바인딩이 없는 호출을 해당 컨텍스트에 맞는 이스케이핑 없이 인터프리터에 직접 전달하는 경우. +* 객체 관계형 매핑(object-relational mapping, ORM) 검색 파라미터에 새니타이징 되지 않은 입력값을 사용하여, 의도하지 않은 추가 민감 데이터 레코드를 조회하는 경우. +* 잠재적으로 악의적일 수 있는 데이터가 그대로 사용되거나, 기존 SQL 또는 커맨드 뒤에 문자열로 이어 붙여지는 경우. 그 결과 동적 쿼리, 커맨드, 또는 저장 프로시저에서 원래의 구문과 공격자가 주입한 악성 데이터가 함께 포함되게 된다. -Some of the more common injections are SQL, NoSQL, OS command, Object Relational Mapping (ORM), LDAP, and Expression Language (EL) or Object Graph Navigation Library (OGNL) injection. The concept is identical among all interpreters. Detection is best achieved by a combination of source code review along with automated testing (including fuzzing) of all parameters, headers, URL, cookies, JSON, SOAP, and XML data inputs. The addition of static (SAST), dynamic (DAST), and interactive (IAST) application security testing tools into the CI/CD pipeline can also be helpful to identify injection flaws before production deployment. +대표적인 인젝션 유형으로는 SQL, NoSQL, OS 커맨드, 객체 관계형 매핑(ORM), LDAP, 그리고 EL 표현식(Expression Language) 및 OGNL 표현식(Object Graph Navigation Library) 인젝션 있다. 인터프리터 종류가 달라도 핵심 원리는 동일하다. 효과적인 탐지를 위해서는 소스 코드 리뷰와 함께, 모든 파라미터, 헤더, URL, 쿠키, JSON, SOAP, 및 XML 데이터 입력에 대한 자동화(퍼징 포함) 테스트하는 게 좋다. CI/CD 파이프라인에 정적(SAST), 동적(DAST), 및 인터랙티브(IAST) 애플리케이션 보안 테스트 도구를 통합하여, 것도 운영 환경 배포 전에 인젝션 결함을 식별하는 데 도움이 될 수 있다. -A related class of injection vulnerabilities has become common in LLMs. These are discussed separately in the [OWASP LLM Top 10](https://genai.owasp.org/llm-top-10/), specifically [LLM01:2025 Prompt Injection](https://genai.owasp.org/llmrisk/llm01-prompt-injection/). +한편 LLM 환경에서도 유사한 계열의 인젝션 취약점이 흔해지고 있다. 이는 [OWASP LLM Top 10](https://genai.owasp.org/llm-top-10/)에서 별도로 다룬다. 특히 [LLM01:2025 프롬프트 인젝션](https://genai.owasp.org/llmrisk/llm01-prompt-injection/) 항목에서 관련 내용을 확인할 수 있다. -## How to prevent. +## 대응 방안. -The best means to prevent injection requires keeping data separate from commands and queries: +인젝션 공격을 예방하는 최선의 방법은 데이터를 명령 및 쿼리로부터 분리하여 유지하는 것이다. -* The preferred option is to use a safe API, which avoids using the interpreter entirely, provides a parameterized interface, or migrates to Object Relational Mapping Tools (ORMs). -**Note:** Even when parameterized, stored procedures can still introduce SQL injection if PL/SQL or T-SQL concatenates queries and data or executes hostile data with EXECUTE IMMEDIATE or exec(). +* 가장 권장되는 방식은 안전한 API를 사용하는 것이다. 이는 인터프리터를 전혀 사용하지 않거나, 입력값을 파라미터 화하도록 하는 인터페이스를 제공하거나, 객체 관계형 매핑(ORM) 도구를 사용하는 방식을 통해 이를 달성할 수 있다. +**참고:** 저장 프로시저는 파라미터화되어 있더라도, PL/SQL 또는 T‑SQL 내부에서 문자열 결합으로 쿼리와 데이터를 연결하거나, EXECUTE IMMEDIATE / exec()처럼 동적 실행 기능으로 적대적 입력을 실행하면 SQL 인젝션이 발생할 수 있다. -When it is not possible to separate the data from commands, you can reduce threats using the following techniques. +데이터를 커맨드로 분리하는 것이 불가능한 경우, 다음 방법을 사용하여 위협을 줄일 수 있다. -* Use positive server-side input validation. This is not a complete defense as many applications require special characters, such as text areas or APIs for mobile applications. -* For any residual dynamic queries, escape special characters using the specific escape syntax for that interpreter. -**Note:** SQL structures such as table names, column names, and so on cannot be escaped, and thus user-supplied structure names are dangerous. This is a common issue in report-writing software. +* 서버 측 입력값 검증은 허용 목록 기반을 사용한다. 다만 텍스트 입력란이나 모바일 API처럼 특수문자 입력이 필요한 경우가 많아, 이것만으로는 완전한 방어가 되기 어렵다. +* 불가피하게 동적 쿼리를 사용하는 지점이 남아 있다면, 사용 중인 인터프리터에서 사용하는 규칙에 맞춰 특수문자를 이스케이프 처리한다. +**참고:** 테이블 명과 칼럼 명 같은 SQL 구문들은 이스케이핑 할 수 없으므로, 사용자가 제공한 입력값을 쓰는 것은 위험하다. 이런 문제는 보고서 생성 기능에서 자주 나타난다. -**Warning** these techniques involve parsing and escaping complex strings, making them error-prone and not robust in the face of minor changes to the underlying system. +**경고** 위 방법들은 문자열을 파싱하고 이스케이프하는 복잡한 처리를 전제로 하며, 구현 실수가 발생하기 쉽고 시스템 내부 동작이 조금만 바뀌어도 방어가 쉽게 무력화될 수 있다. -## Example attack scenarios. +## 공격 시나리오 예시. -**Scenario #1:** An application uses untrusted data in the construction of the following vulnerable SQL call: +**시나리오 1:** 애플리케이션이 신뢰할 수 없는 데이터를 사용하여 다음과 같은 취약 방식으로 SQL을 호출한다. ``` String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'"; ``` -An attacker modifies the 'id' parameter value in their browser to send: `' OR '1'='1`. For example: +공격자는 'id' 값에 `' OR '1'='1`와 같은 페이로드를 주입하여 다음과 같이 요청을 보낼 수 있다. ``` http://example.com/app/accountView?id=' OR '1'='1 ``` -This changes the meaning of the query to return all records from the accounts table. More dangerous attacks could modify or delete data or even invoke stored procedures. +그 결과 쿼리의 내용이 변경되어 accounts 테이블의 전체 레코드가 조회될 수 있다. 상황에 따라 공격자는 데이터 변경 및 삭제 또는 저장된 프로시저 실행 등 더 심각한 행위를 유도할 수도 있다. -**Scenario #2:** An application's blind trust in frameworks may result in queries that are still vulnerable. For example, Hibernate Query Language (HQL): +**시나리오 2:** 프레임워크를 사용하더라도 이를 과신하면, 여전히 인젝션에 취약할 수 있다. 취약한 하이퍼네이트 쿼리 언어(Hibernate Query Language, HQL)의 경우를 보자. ``` Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'"); ``` -An attacker supplies: `' OR custID IS NOT NULL OR custID='`. This bypasses the filter and returns all accounts. While HQL has fewer dangerous functions than raw SQL, it still allows unauthorized data access when user input is concatenated into queries. +공격자는 입력값으로 `' OR custID IS NOT NULL OR custID='`를 입력한다. 이는 필터를 우회하고 모든 계정의 레코드를 반환한다. HQL은 로우 raw SQL보다 위험한 함수가 더 적지만, 사용자 입력 값이 쿼리의 문자열로 연결될 때 여전히 허용되지 않은 데이터에 접근할 수 있다. -**Scenario #3:** An application passes user input directly to an OS command: +**시나리오 3:** 애플리케이션이 사용자 입력을 OS 커맨드으로 사용한다. ``` String cmd = "nslookup " + request.getParameter("domain"); Runtime.getRuntime().exec(cmd); ``` -An attacker supplies `example.com; cat /etc/passwd` to execute arbitrary commands on the server. +공격자는 `example.com; cat /etc/passwd`를 입력하여 서버에서 임의의 명령을 실행한다. -## References. +## 참조. * [OWASP Proactive Controls: Secure Database Access](https://owasp.org/www-project-proactive-controls/v3/en/c3-secure-database) * [OWASP ASVS: V5 Input Validation and Encoding](https://owasp.org/www-project-application-security-verification-standard) @@ -132,7 +131,7 @@ An attacker supplies `example.com; cat /etc/passwd` to execute arbitrary command -## List of Mapped CWEs +## 해당되는 CWE. * [CWE-20 Improper Input Validation](https://cwe.mitre.org/data/definitions/20.html) From 2c7ea0efec856e476571e9bacf46f479a4f0e658 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sat, 3 Jan 2026 00:16:17 +0900 Subject: [PATCH 055/167] typo --- 2025/docs/ko/A05_2025-Injection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index 4d955182c..b9c849ad7 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -2,7 +2,7 @@ ## 배경. -인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화(크로스 사이트 스크립팅)에 대한 보고된 CVE 수가 매우 많아 이 범주의 평균 가중 영향도가 낮아졌다. +인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화(크로스 사이트 스크립팅)에 대한 보고된 CVE 수가 매우 많아 이 범주의 평균 가중 영향도가 낮아졌다. ## 점수표. From c2ad78c2f636c55fac018422c5f3b4ba5cd9f66b Mon Sep 17 00:00:00 2001 From: ni5am Date: Sat, 3 Jan 2026 00:17:36 +0900 Subject: [PATCH 056/167] Fix typo in A05_2025-Injection.md regarding escaping --- 2025/docs/ko/A05_2025-Injection.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index b9c849ad7..2a2c51e05 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -59,7 +59,7 @@ 다음과 같은 경우 인젝션 공격에 취약할 수 있다. * 사용자가 제공한 데이터가 애플리케이션에 의해 검증, 필터링 또는 새니타이징되지 않는 경우. -* 동적 쿼리 또는 파라미터 바인딩이 없는 호출을 해당 컨텍스트에 맞는 이스케이핑 없이 인터프리터에 직접 전달하는 경우. +* 동적 쿼리 또는 파라미터 바인딩이 없는 호출을 해당 컨텍스트에 맞는 이스케이프 없이 인터프리터에 직접 전달하는 경우. * 객체 관계형 매핑(object-relational mapping, ORM) 검색 파라미터에 새니타이징 되지 않은 입력값을 사용하여, 의도하지 않은 추가 민감 데이터 레코드를 조회하는 경우. * 잠재적으로 악의적일 수 있는 데이터가 그대로 사용되거나, 기존 SQL 또는 커맨드 뒤에 문자열로 이어 붙여지는 경우. 그 결과 동적 쿼리, 커맨드, 또는 저장 프로시저에서 원래의 구문과 공격자가 주입한 악성 데이터가 함께 포함되게 된다. @@ -79,7 +79,7 @@ * 서버 측 입력값 검증은 허용 목록 기반을 사용한다. 다만 텍스트 입력란이나 모바일 API처럼 특수문자 입력이 필요한 경우가 많아, 이것만으로는 완전한 방어가 되기 어렵다. * 불가피하게 동적 쿼리를 사용하는 지점이 남아 있다면, 사용 중인 인터프리터에서 사용하는 규칙에 맞춰 특수문자를 이스케이프 처리한다. -**참고:** 테이블 명과 칼럼 명 같은 SQL 구문들은 이스케이핑 할 수 없으므로, 사용자가 제공한 입력값을 쓰는 것은 위험하다. 이런 문제는 보고서 생성 기능에서 자주 나타난다. +**참고:** 테이블 명과 칼럼 명 같은 SQL 구문들은 이스케이프 할 수 없으므로, 사용자가 제공한 입력값을 쓰는 것은 위험하다. 이런 문제는 보고서 생성 기능에서 자주 나타난다. **경고** 위 방법들은 문자열을 파싱하고 이스케이프하는 복잡한 처리를 전제로 하며, 구현 실수가 발생하기 쉽고 시스템 내부 동작이 조금만 바뀌어도 방어가 쉽게 무력화될 수 있다. From d7bdc958727b4badc555bf2f046f6db72105a9b4 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sat, 3 Jan 2026 00:19:50 +0900 Subject: [PATCH 057/167] Add A06 file in the ko directory --- 2025/docs/ko/A06_2025-Insecure_Design.md | 199 +++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 2025/docs/ko/A06_2025-Insecure_Design.md diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md new file mode 100644 index 000000000..aaf212113 --- /dev/null +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -0,0 +1,199 @@ +# A06:2025 Insecure Design ![icon](../assets/TOP_10_Icons_Final_Insecure_Design.png){: style="height:80px;width:80px" align="right"} + + +## Background. + +Insecure Design slides two spots from #4 to #6 in the ranking as **[A02:2025-Security Misconfiguration](A02_2025-Security_Misconfiguration.md)** and **[A03:2025-Software Supply Chain Failures](A03_2025-Software_Supply_Chain_Failures.md)** leapfrog it. This category was introduced in 2021, and we have seen noticeable improvements in the industry related to threat modeling and a greater emphasis on secure design. This category focuses on risks related to design and architectural flaws, with a call for more use of threat modeling, secure design patterns, and reference architectures. This includes flaws in the business logic of an application, e.g. the lack of defining unwanted or unexpected state changes inside an application. As a community, we need to move beyond "shift-left" in the coding space, to pre-code activities such as requirements writing and application design, that are critical for the principles of Secure by Design (e.g. see **[Establish a Modern AppSec Program: Planning and Design Phase](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**). Notable Common Weakness Enumerations (CWEs) include *CWE-256: Unprotected Storage of Credentials, CWE-269 Improper Privilege Management, CWE-434 Unrestricted Upload of File with Dangerous Type, CWE-501: Trust Boundary Violation, and CWE-522: Insufficiently Protected Credentials.* + + +## Score table. + + +
CWEs Mapped + 해당되는 CWE 개수 Max Incidence Rate + 최대 취약점 발생률 Avg Incidence Rate + 평균 취약점 발생률 Max Coverage + 최대 테스트 커버리지 Avg Coverage + 평균 테스트 커버리지 Avg Weighted Exploit + 평균 가중 악용도 Avg Weighted Impact + 평균 가중 영향도 Total Occurrences + 총 발생 건수 Total CVEs + 총 CVE 건수
+ + + + + + + + + + + + + + + + + + + + + + +
CWEs Mapped + Max Incidence Rate + Avg Incidence Rate + Max Coverage + Avg Coverage + Avg Weighted Exploit + Avg Weighted Impact + Total Occurrences + Total CVEs +
39 + 22.18% + 1.86% + 88.76% + 35.18% + 6.96 + 4.05 + 729,882 + 7,647 +
+ + + +## Description. + +Insecure design is a broad category representing different weaknesses, expressed as “missing or ineffective control design.” Insecure design is not the source for all other Top Ten risk categories. Note that there is a difference between insecure design and insecure implementation. We differentiate between design flaws and implementation defects for a reason, they have different root causes, take place at different times in the development process, and have different remediations. A secure design can still have implementation defects leading to vulnerabilities that may be exploited. An insecure design cannot be fixed by a perfect implementation as needed security controls were never created to defend against specific attacks. One of the factors that contributes to insecure design is the lack of business risk profiling inherent in the software or system being developed, and thus the failure to determine what level of security design is required. + +Three key parts of having a secure design are: + +* Gathering Requirements and Resource Management +* Creating a Secure Design +* Having a Secure Development Lifecycle + + +### Requirements and Resource Management + +Collect and negotiate the business requirements for an application with the business, including the protection requirements concerning confidentiality, integrity, availability, and authenticity of all data assets and the expected business logic. Take into account how exposed your application will be and if you need segregation of tenants (beyond those needed for access control). Compile the technical requirements, including functional and non-functional security requirements. Plan and negotiate the budget covering all design, build, testing, and operation, including security activities. + + +### Secure Design + +Secure design is a culture and methodology that constantly evaluates threats and ensures that code is robustly designed and tested to prevent known attack methods. Threat modeling should be integrated into refinement sessions (or similar activities); look for changes in data flows and access control or other security controls. In the user story development, determine the correct flow and failure states, ensure they are well understood and agreed upon by the responsible and impacted parties. Analyze assumptions and conditions for expected and failure flows to ensure they remain accurate and desirable. Determine how to validate the assumptions and enforce conditions needed for proper behaviors. Ensure the results are documented in the user story. Learn from mistakes and offer positive incentives to promote improvements. Secure design is neither an add-on nor a tool that you can add to software. + + +### Secure Development Lifecycle + +Secure software requires a secure development lifecycle, a secure design pattern, a paved road methodology, a secure component library, appropriate tooling, threat modeling, and incident post-mortems that are used to improve the process. Reach out to your security specialists at the beginning of a software project, throughout the project, and for ongoing software maintenance. Consider leveraging the [OWASP Software Assurance Maturity Model (SAMM)](https://owaspsamm.org/) to help structure your secure software development efforts. + +Often self-responsibility of developers is underappreciated. Foster a culture of awareness, responsibility and proactive risk mitigation. Regular exchanges about security (e.g. during threat modeling sessions) can generate a mindset for including security in all important design decisions. + + +## How to prevent. + + + +* Establish and use a secure development lifecycle with AppSec professionals to help evaluate and design security and privacy-related controls +* Establish and use a library of secure design patterns or paved-road components +* Use threat modeling for critical parts of the application such as authentication, access control, business logic, and key flows +* User threat modeling as an educational tool to generate a security mindset +* Integrate security language and controls into user stories +* Integrate plausibility checks at each tier of your application (from frontend to backend) +* Write unit and integration tests to validate that all critical flows are resistant to the threat model. Compile use-cases *and* misuse-cases for each tier of your application. +* Segregate tier layers on the system and network layers, depending on the exposure and protection needs +* Segregate tenants robustly by design throughout all tiers + + +## Example attack scenarios. + +**Scenario #1:** A credential recovery workflow might include “questions and answers,” which is prohibited by NIST 800-63b, the OWASP ASVS, and the OWASP Top 10. Questions and answers cannot be trusted as evidence of identity, as more than one person can know the answers. Such functionality should be removed and replaced with a more secure design. + +**Scenario #2:** A cinema chain allows group booking discounts and has a maximum of fifteen attendees before requiring a deposit. Attackers could threat model this flow and test if they can find an attack vector in the business logic of the application, e.g. booking six hundred seats and all cinemas at once in a few requests, causing a massive loss of income. + +**Scenario #3:** A retail chain’s e-commerce website does not have protection against bots run by scalpers buying high-end video cards to resell on auction websites. This creates terrible publicity for the video card makers and retail chain owners, and enduring bad blood with enthusiasts who cannot obtain these cards at any price. Careful anti-bot design and domain logic rules, such as purchases made within a few seconds of availability, might identify inauthentic purchases and reject such transactions. + + +## References. + + + +* [OWASP Cheat Sheet: Secure Design Principles](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Product_Design_Cheat_Sheet.html) +* [OWASP SAMM: Design | Secure Architecture](https://owaspsamm.org/model/design/secure-architecture/) +* [OWASP SAMM: Design | Threat Assessment](https://owaspsamm.org/model/design/threat-assessment/) +* [NIST – Guidelines on Minimum Standards for Developer Verification of Software](https://www.nist.gov/publications/guidelines-minimum-standards-developer-verification-software) +* [The Threat Modeling Manifesto](https://threatmodelingmanifesto.org/) +* [Awesome Threat Modeling](https://github.com/hysnsec/awesome-threat-modelling) + + +## List of Mapped CWEs + +* [CWE-73 External Control of File Name or Path](https://cwe.mitre.org/data/definitions/73.html) + +* [CWE-183 Permissive List of Allowed Inputs](https://cwe.mitre.org/data/definitions/183.html) + +* [CWE-256 Unprotected Storage of Credentials](https://cwe.mitre.org/data/definitions/256.html) + +* [CWE-266 Incorrect Privilege Assignment](https://cwe.mitre.org/data/definitions/266.html) + +* [CWE-269 Improper Privilege Management](https://cwe.mitre.org/data/definitions/269.html) + +* [CWE-286 Incorrect User Management](https://cwe.mitre.org/data/definitions/286.html) + +* [CWE-311 Missing Encryption of Sensitive Data](https://cwe.mitre.org/data/definitions/311.html) + +* [CWE-312 Cleartext Storage of Sensitive Information](https://cwe.mitre.org/data/definitions/312.html) + +* [CWE-313 Cleartext Storage in a File or on Disk](https://cwe.mitre.org/data/definitions/313.html) + +* [CWE-316 Cleartext Storage of Sensitive Information in Memory](https://cwe.mitre.org/data/definitions/316.html) + +* [CWE-362 Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')](https://cwe.mitre.org/data/definitions/362.html) + +* [CWE-382 J2EE Bad Practices: Use of System.exit()](https://cwe.mitre.org/data/definitions/382.html) + +* [CWE-419 Unprotected Primary Channel](https://cwe.mitre.org/data/definitions/419.html) + +* [CWE-434 Unrestricted Upload of File with Dangerous Type](https://cwe.mitre.org/data/definitions/434.html) + +* [CWE-436 Interpretation Conflict](https://cwe.mitre.org/data/definitions/436.html) + +* [CWE-444 Inconsistent Interpretation of HTTP Requests ('HTTP Request Smuggling')](https://cwe.mitre.org/data/definitions/444.html) + +* [CWE-451 User Interface (UI) Misrepresentation of Critical Information](https://cwe.mitre.org/data/definitions/451.html) + +* [CWE-454 External Initialization of Trusted Variables or Data Stores](https://cwe.mitre.org/data/definitions/454.html) + +* [CWE-472 External Control of Assumed-Immutable Web Parameter](https://cwe.mitre.org/data/definitions/472.html) + +* [CWE-501 Trust Boundary Violation](https://cwe.mitre.org/data/definitions/501.html) + +* [CWE-522 Insufficiently Protected Credentials](https://cwe.mitre.org/data/definitions/522.html) + +* [CWE-525 Use of Web Browser Cache Containing Sensitive Information](https://cwe.mitre.org/data/definitions/525.html) + +* [CWE-539 Use of Persistent Cookies Containing Sensitive Information](https://cwe.mitre.org/data/definitions/539.html) + +* [CWE-598 Use of GET Request Method With Sensitive Query Strings](https://cwe.mitre.org/data/definitions/598.html) + +* [CWE-602 Client-Side Enforcement of Server-Side Security](https://cwe.mitre.org/data/definitions/602.html) + +* [CWE-628 Function Call with Incorrectly Specified Arguments](https://cwe.mitre.org/data/definitions/628.html) + +* [CWE-642 External Control of Critical State Data](https://cwe.mitre.org/data/definitions/642.html) + +* [CWE-646 Reliance on File Name or Extension of Externally-Supplied File](https://cwe.mitre.org/data/definitions/646.html) + +* [CWE-653 Insufficient Compartmentalization](https://cwe.mitre.org/data/definitions/653.html) + +* [CWE-656 Reliance on Security Through Obscurity](https://cwe.mitre.org/data/definitions/656.html) + +* [CWE-657 Violation of Secure Design Principles](https://cwe.mitre.org/data/definitions/657.html) + +* [CWE-676 Use of Potentially Dangerous Function](https://cwe.mitre.org/data/definitions/676.html) + +* [CWE-693 Protection Mechanism Failure](https://cwe.mitre.org/data/definitions/693.html) + +* [CWE-799 Improper Control of Interaction Frequency](https://cwe.mitre.org/data/definitions/799.html) + +* [CWE-807 Reliance on Untrusted Inputs in a Security Decision](https://cwe.mitre.org/data/definitions/807.html) + +* [CWE-841 Improper Enforcement of Behavioral Workflow](https://cwe.mitre.org/data/definitions/841.html) + +* [CWE-1021 Improper Restriction of Rendered UI Layers or Frames](https://cwe.mitre.org/data/definitions/1021.html) + +* [CWE-1022 Use of Web Link to Untrusted Target with window.opener Access](https://cwe.mitre.org/data/definitions/1022.html) + +* [CWE-1125 Excessive Attack Surface](https://cwe.mitre.org/data/definitions/1125.html) From 59dc5902d33588c2339d428c81f576c75ceae5ec Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Sat, 3 Jan 2026 00:28:30 +0900 Subject: [PATCH 058/167] Copy ko/A08_2025-Software_or_Data_Integrity_Failures --- ...025-Software_or_Data_Integrity_Failures.md | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md new file mode 100644 index 000000000..6c465c9b0 --- /dev/null +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -0,0 +1,122 @@ +# A08:2025 Software or Data Integrity Failures ![icon](../assets/TOP_10_Icons_Final_Software_and_Data_Integrity_Failures.png){: style="height:80px;width:80px" align="right"} + +## Background. + +Software or Data Integrity Failures continues at #8, with a slight, clarifying name change from "Software *and* Data Integrity Failures". This category is focused on the failure to maintain trust boundaries and verify the integrity of software, code, and data artifacts at a lower level than Software Supply Chain Failures. This category focuses on making assumptions related to software updates and critical data, without verifying integrity. Notable Common Weakness Enumerations (CWEs) include *CWE-829: Inclusion of Functionality from Untrusted Control Sphere*, *CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes*, and *CWE-502: Deserialization of Untrusted Data*. + + +## Score table. + + + + + + + + + + + + + + + + + + + + + + + + + +
CWEs Mapped + Max Incidence Rate + Avg Incidence Rate + Max Coverage + Avg Coverage + Avg Weighted Exploit + Avg Weighted Impact + Total Occurrences + Total CVEs +
14 + 8.98% + 2.75% + 78.52% + 45.49% + 7.11 + 4.79 + 501,327 + 3,331 +
+ + + +## Description. + +Software and data integrity failures relate to code and infrastructure that does not protect against invalid or untrusted code or data being treated as trusted and valid. An example of this is where an application relies upon plugins, libraries, or modules from untrusted sources, repositories, and content delivery networks (CDNs). An insecure CI/CD pipeline without consuming and providing software integrity checks can introduce the potential for unauthorized access, insecure or malicious code, or system compromise. Another example of this is a CI/CD that pulls code or artifacts from untrusted places and/or doesn’t verify them before use (by checking the signature or similar mechanism). Lastly, many applications now include auto-update functionality, where updates are downloaded without sufficient integrity verification and applied to the previously trusted application. Attackers could potentially upload their own updates to be distributed and run on all installations. Another example is where objects or data are encoded or serialized into a structure that an attacker can see and modify is vulnerable to insecure deserialization. + + +## How to prevent. + + + +* Use digital signatures or similar mechanisms to verify the software or data is from the expected source and has not been altered. +* Ensure libraries and dependencies, such as npm or Maven, are only consuming trusted repositories. If you have a higher risk profile, consider hosting an internal known-good repository that's vetted. +* Ensure that there is a review process for code and configuration changes to minimize the chance that malicious code or configuration could be introduced into your software pipeline. +* Ensure that your CI/CD pipeline has proper segregation, configuration, and access control to ensure the integrity of the code flowing through the build and deploy processes. +* Ensure that unsigned or unencrypted serialized data is not received from untrusted clients and subsequently used without some form of integrity check or digital signature to detect tampering or replay of the serialized data. + + +## Example attack scenarios. + +**Scenario #1 Inclusion of Web Functionality from an Untrusted Source:** A company uses an external service provider to provide support functionality. For convenience, it has a DNS mapping for `myCompany.SupportProvider.com` to `support.myCompany.com`. This means that all cookies, including authentication cookies, set on the `myCompany.com` domain will now be sent to the support provider. Anyone with access to the support provider’s infrastructure can steal the cookies of all of your users that have visited `support.myCompany.com` and perform a session hijacking attack. + +**Scenario #2 Update without signing:** Many home routers, set-top boxes, device firmware, and others do not verify updates via signed firmware. Unsigned firmware is a growing target for attackers and is expected to only get worse. This is a major concern as many times there is no mechanism to remediate other than to fix in a future version and wait for previous versions to age out. + +**Scenario #3 Use of Package from an Untrusted Source:** A developer has trouble finding the updated version of a package they are looking for, so they download it not from the regular, trusted package manager, but from a website online. The package is not signed, and thus there is no opportunity to ensure integrity. The package includes malicious code. + +**Scenario #4 Insecure Deserialization:** A React application calls a set of Spring Boot microservices. Being functional programmers, they tried to ensure that their code is immutable. The solution they came up with is serializing the user state and passing it back and forth with each request. An attacker notices the "rO0" Java object signature (in base64) and uses the [Java Deserialization Scanner](https://github.com/federicodotta/Java-Deserialization-Scanner) to gain remote code execution on the application server. + +## References. + +* [OWASP Cheat Sheet: Software Supply Chain Security](https://cheatsheetseries.owasp.org/cheatsheets/Software_Supply_Chain_Security_Cheat_Sheet.html) +* [OWASP Cheat Sheet: Infrastructure as Code](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) +* [OWASP Cheat Sheet: Deserialization](https://wiki.owasp.org/index.php/Deserialization_Cheat_Sheet) +* [SAFECode Software Integrity Controls](https://safecode.org/publication/SAFECode_Software_Integrity_Controls0610.pdf) +* [A 'Worst Nightmare' Cyberattack: The Untold Story Of The SolarWinds Hack](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) +* [CodeCov Bash Uploader Compromise](https://about.codecov.io/security-update) +* [Securing DevOps by Julien Vehent](https://www.manning.com/books/securing-devops) +* [Insecure Deserialization by Tenendo](https://tenendo.com/insecure-deserialization/) + + +## List of Mapped CWEs + +* [CWE-345 Insufficient Verification of Data Authenticity](https://cwe.mitre.org/data/definitions/345.html) + +* [CWE-353 Missing Support for Integrity Check](https://cwe.mitre.org/data/definitions/353.html) + +* [CWE-426 Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html) + +* [CWE-427 Uncontrolled Search Path Element](https://cwe.mitre.org/data/definitions/427.html) + +* [CWE-494 Download of Code Without Integrity Check](https://cwe.mitre.org/data/definitions/494.html) + +* [CWE-502 Deserialization of Untrusted Data](https://cwe.mitre.org/data/definitions/502.html) + +* [CWE-506 Embedded Malicious Code](https://cwe.mitre.org/data/definitions/506.html) + +* [CWE-509 Replicating Malicious Code (Virus or Worm)](https://cwe.mitre.org/data/definitions/509.html) + +* [CWE-565 Reliance on Cookies without Validation and Integrity Checking](https://cwe.mitre.org/data/definitions/565.html) + +* [CWE-784 Reliance on Cookies without Validation and Integrity Checking in a Security Decision](https://cwe.mitre.org/data/definitions/784.html) + +* [CWE-829 Inclusion of Functionality from Untrusted Control Sphere](https://cwe.mitre.org/data/definitions/829.html) + +* [CWE-830 Inclusion of Web Functionality from an Untrusted Source](https://cwe.mitre.org/data/definitions/830.html) + +* [CWE-915 Improperly Controlled Modification of Dynamically-Determined Object Attributes](https://cwe.mitre.org/data/definitions/915.html) + +* [CWE-926 Improper Export of Android Application Components](https://cwe.mitre.org/data/definitions/926.html) From f321db292b4c3a4cd09d306eae6be2fc3301c45f Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Sat, 3 Jan 2026 01:16:13 +0900 Subject: [PATCH 059/167] Translate and update A08: Software/Data Integrity Failures Updated the document to reflect the Korean translation and clarified the context of Software or Data Integrity Failures. Added prevention methods and example attack scenarios. --- ...025-Software_or_Data_Integrity_Failures.md | 101 +++++++++--------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index 6c465c9b0..ca39c4a47 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -1,32 +1,32 @@ -# A08:2025 Software or Data Integrity Failures ![icon](../assets/TOP_10_Icons_Final_Software_and_Data_Integrity_Failures.png){: style="height:80px;width:80px" align="right"} +# A08:2025 소프트웨어 또는 데이터 무결성 실패(오류?) ![icon](../assets/TOP_10_Icons_Final_Software_and_Data_Integrity_Failures.png){: style="height:80px;width:80px" align="right"} -## Background. +## 배경. -Software or Data Integrity Failures continues at #8, with a slight, clarifying name change from "Software *and* Data Integrity Failures". This category is focused on the failure to maintain trust boundaries and verify the integrity of software, code, and data artifacts at a lower level than Software Supply Chain Failures. This category focuses on making assumptions related to software updates and critical data, without verifying integrity. Notable Common Weakness Enumerations (CWEs) include *CWE-829: Inclusion of Functionality from Untrusted Control Sphere*, *CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes*, and *CWE-502: Deserialization of Untrusted Data*. +소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 및 데이터 무결성 오류"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 이 범주는 소프트웨어 공급망 실패(Software Supply Chain Failures)보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 공통 취약점 열거(목록?)(Common Weakness Enumeration, CWE)로는 CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함(Inclusion of Functionality from Untrusted Control Sphere), CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정(Improperly Controlled Modification of Dynamically-Determined Object Attributes), CWE-502: 신뢰할 수 없는 데이터의 역직렬화(Deserialization of Untrusted Data)가 있다. -## Score table. +## 점수 표. - - - - - - - - - @@ -53,70 +53,69 @@ Software or Data Integrity Failures continues at #8, with a slight, clarifying n -## Description. +## 설명. -Software and data integrity failures relate to code and infrastructure that does not protect against invalid or untrusted code or data being treated as trusted and valid. An example of this is where an application relies upon plugins, libraries, or modules from untrusted sources, repositories, and content delivery networks (CDNs). An insecure CI/CD pipeline without consuming and providing software integrity checks can introduce the potential for unauthorized access, insecure or malicious code, or system compromise. Another example of this is a CI/CD that pulls code or artifacts from untrusted places and/or doesn’t verify them before use (by checking the signature or similar mechanism). Lastly, many applications now include auto-update functionality, where updates are downloaded without sufficient integrity verification and applied to the previously trusted application. Attackers could potentially upload their own updates to be distributed and run on all installations. Another example is where objects or data are encoded or serialized into a structure that an attacker can see and modify is vulnerable to insecure deserialization. +소프트웨어 및 데이터 무결성 실패는 유효하지 않거나 신뢰할 수 없는 코드 또는 데이터가 신뢰할 수 있고 유효한 것으로 취급되는 것을 방지하지 못하는 코드 및 인프라와 관련된다. 예를 들어, 애플리케이션이 신뢰할 수 없는 출처, 리포지토리, 콘텐츠 전송 네트워크(CDN)에서 제공되는 플러그인, 라이브러리, 모듈에 의존하는 경우가 이에 해당한다. 소프트웨어 무결성 검증을 수행하지 않거나(원:소비하지 않거나) 제공하지 않는 불안전한 CI/CD 파이프라인은 비인가 접근, 불안전하거나 악성인 코드, 또는 시스템 손상으로 이어질 잠재적 위험을 초래할 수 있다. 또 다른 예로, CI/CD가 신뢰할 수 없는 위치에서 코드나 아티팩트를 가져오고, 사용 전에 서명 확인 등 유사한 메커니즘으로 이를 검증하지 않는 경우가 있다. 마지막으로, 많은 애플리케이션에는 자동 업데이트 기능이 포함되어 있는데, 업데이트가 충분한 무결성 검증 없이 다운로드되어 이전에 신뢰하던 애플리케이션에 적용될 수 있다. 공격자는 자신의 업데이트를 업로드하여 모든 설치본에 배포 및 실행되도록 만들 수도 있다. 또 다른 예로, 객체나 데이터가 공격자가 보고 수정할 수 있는 구조로 인코딩되거나 직렬화되는 경우, 불안전한 역직렬화(insecure deserialization)에 취약해질 수 있다. +## 예방 방법. -## How to prevent. +* 디지털 서명 또는 유사한 메커니즘을 사용하여 소프트웨어나 데이터가 예상된 출처에서 왔고 변조되지 않았음을 검증한다. +* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 리포지토리만 사용하도록 보장한다. 위험 수준이 더 높다면, 검증된 내부 "known-good(잘 알려진?)" 리포지토리를 호스팅하는 방안을 고려한다. +* 악성 코드 또는 설정이 소프트웨어 파이프라인에 유입될 가능성을 최소화하기 위해, 코드 및 구성 변경에 대한 검토 절차를 마련한다. +* 빌드 및 배포 과정에서 흐르는 코드의 무결성을 보장할 수 있도록, CI/CD 파이프라인에 적절한 분리(격리), 구성, 접근 통제를 적용한다. +* 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 수신된 뒤, 변조 또는 재전송(replay)을 탐지하기 위한 무결성 검사나 디지털 서명 없이 사용되지 않도록 보장한다. -* Use digital signatures or similar mechanisms to verify the software or data is from the expected source and has not been altered. -* Ensure libraries and dependencies, such as npm or Maven, are only consuming trusted repositories. If you have a higher risk profile, consider hosting an internal known-good repository that's vetted. -* Ensure that there is a review process for code and configuration changes to minimize the chance that malicious code or configuration could be introduced into your software pipeline. -* Ensure that your CI/CD pipeline has proper segregation, configuration, and access control to ensure the integrity of the code flowing through the build and deploy processes. -* Ensure that unsigned or unencrypted serialized data is not received from untrusted clients and subsequently used without some form of integrity check or digital signature to detect tampering or replay of the serialized data. +## 공격 시나리오 예시. -## Example attack scenarios. +**시나리오 #1 신뢰할 수 없는 출처로부터의 웹 기능 포함(포괄?):** 한 회사가 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 지원 제공업체로 전송된다. 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. -**Scenario #1 Inclusion of Web Functionality from an Untrusted Source:** A company uses an external service provider to provide support functionality. For convenience, it has a DNS mapping for `myCompany.SupportProvider.com` to `support.myCompany.com`. This means that all cookies, including authentication cookies, set on the `myCompany.com` domain will now be sent to the support provider. Anyone with access to the support provider’s infrastructure can steal the cookies of all of your users that have visited `support.myCompany.com` and perform a session hijacking attack. +**시나리오 #2 서명 없이 업데이트:** 많은 가정용 라우터, 셋톱박스, 장치 펌웨어 등은 서명된 펌웨어를 통해 업데이트를 검증하지 않는다. 서명되지 않은 펌웨어는 공격자에게 점점 더 매력적인 표적이 되고 있으며, 앞으로도 악화될 것으로 예상된다. 이는 대개 향후 버전에서 수정한 뒤 이전 버전이 자연스럽게 도태될 때까지 기다리는 것 외에는 별도의 개선(리미디에이션) 메커니즘이 없는 경우가 많다는 점에서 큰 우려 사항이다. -**Scenario #2 Update without signing:** Many home routers, set-top boxes, device firmware, and others do not verify updates via signed firmware. Unsigned firmware is a growing target for attackers and is expected to only get worse. This is a major concern as many times there is no mechanism to remediate other than to fix in a future version and wait for previous versions to age out. +**시나리오 #3 신뢰할 수 없는 출처의 패키지 사용:** 한 개발자가 찾고 있는 패키지의 최신 버전을 구하기 어렵자, 일반적으로 사용하는 신뢰할 수 있는 패키지 관리자가 아니라 온라인 웹사이트에서 패키지를 다운로드한다. 해당 패키지는 서명되어 있지 않으므로 무결성을 보장할 방법이 없다. 해당 패키지에는 악성 코드가 포함되어 있다. -**Scenario #3 Use of Package from an Untrusted Source:** A developer has trouble finding the updated version of a package they are looking for, so they download it not from the regular, trusted package manager, but from a website online. The package is not signed, and thus there is no opportunity to ensure integrity. The package includes malicious code. +**시나리오 #4 불안전한 역직렬화(Insecure Deserialization):** 한 React 애플리케이션이 Spring Boot 마이크로서비스 집합을 호출한다. 함수형 프로그래밍을 지향하던 이들은 코드의 불변성(immutability)을 보장하려고 했다. 그들이 선택한 해결책은 사용자 상태를 직렬화(serialization)하여 각 요청마다 이를 주고받는 것이었다. 공격자는 (base64로 인코딩된) "rO0" 자바 객체 시그니처를 발견하고, [Java Deserialization Scanner](https://github.com/federicodotta/Java-Deserialization-Scanner)를 사용해 애플리케이션 서버에서 원격 코드 실행(RCE)을 획득한다. -**Scenario #4 Insecure Deserialization:** A React application calls a set of Spring Boot microservices. Being functional programmers, they tried to ensure that their code is immutable. The solution they came up with is serializing the user state and passing it back and forth with each request. An attacker notices the "rO0" Java object signature (in base64) and uses the [Java Deserialization Scanner](https://github.com/federicodotta/Java-Deserialization-Scanner) to gain remote code execution on the application server. +## 참조. -## References. +* [OWASP 치트 시트: 소프트웨어 공급망 보안](https://cheatsheetseries.owasp.org/cheatsheets/Software_Supply_Chain_Security_Cheat_Sheet.html) +* [OWASP 치트 시트: 코드형 인프라(Infrastructure as Code)](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) +* [OWASP 치트 시트: 역직렬화(Deserialization)](https://wiki.owasp.org/index.php/Deserialization_Cheat_Sheet) +* [SAFECode 소프트웨어 무결성 통제(Software Integrity Controls)](https://safecode.org/publication/SAFECode_Software_Integrity_Controls0610.pdf) +* [‘최악의 악몽’ 사이버 공격: SolarWinds 해킹의 알려지지 않은 이야기](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) +* [CodeCov Bash Uploader 침해 사고](https://about.codecov.io/security-update) +* [Julien Vehent의 『Securing DevOps』](https://www.manning.com/books/securing-devops) +* [Tenendo: 불안전한 역직렬화(Insecure Deserialization)](https://tenendo.com/insecure-deserialization/) -* [OWASP Cheat Sheet: Software Supply Chain Security](https://cheatsheetseries.owasp.org/cheatsheets/Software_Supply_Chain_Security_Cheat_Sheet.html) -* [OWASP Cheat Sheet: Infrastructure as Code](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) -* [OWASP Cheat Sheet: Deserialization](https://wiki.owasp.org/index.php/Deserialization_Cheat_Sheet) -* [SAFECode Software Integrity Controls](https://safecode.org/publication/SAFECode_Software_Integrity_Controls0610.pdf) -* [A 'Worst Nightmare' Cyberattack: The Untold Story Of The SolarWinds Hack](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) -* [CodeCov Bash Uploader Compromise](https://about.codecov.io/security-update) -* [Securing DevOps by Julien Vehent](https://www.manning.com/books/securing-devops) -* [Insecure Deserialization by Tenendo](https://tenendo.com/insecure-deserialization/) +## 매핑된 CWE 목록 -## List of Mapped CWEs +* [CWE-345 데이터 진정성에 대한 불충분한 검증(Insufficient Verification of Data Authenticity)](https://cwe.mitre.org/data/definitions/345.html) -* [CWE-345 Insufficient Verification of Data Authenticity](https://cwe.mitre.org/data/definitions/345.html) +* [CWE-353 무결성 검사 지원 누락(Missing Support for Integrity Check)](https://cwe.mitre.org/data/definitions/353.html) -* [CWE-353 Missing Support for Integrity Check](https://cwe.mitre.org/data/definitions/353.html) +* [CWE-426 신뢰할 수 없는 검색 경로(Untrusted Search Path)](https://cwe.mitre.org/data/definitions/426.html) -* [CWE-426 Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html) +* [CWE-427 통제되지 않은 검색 경로 요소(Uncontrolled Search Path Element)](https://cwe.mitre.org/data/definitions/427.html) -* [CWE-427 Uncontrolled Search Path Element](https://cwe.mitre.org/data/definitions/427.html) +* [CWE-494 무결성 검사 없이 코드 다운로드(Download of Code Without Integrity Check)](https://cwe.mitre.org/data/definitions/494.html) -* [CWE-494 Download of Code Without Integrity Check](https://cwe.mitre.org/data/definitions/494.html) +* [CWE-502 신뢰할 수 없는 데이터의 역직렬화(Deserialization of Untrusted Data)](https://cwe.mitre.org/data/definitions/502.html) -* [CWE-502 Deserialization of Untrusted Data](https://cwe.mitre.org/data/definitions/502.html) +* [CWE-506 악성 코드 내장(Embedded Malicious Code)](https://cwe.mitre.org/data/definitions/506.html) -* [CWE-506 Embedded Malicious Code](https://cwe.mitre.org/data/definitions/506.html) +* [CWE-509 악성 코드 복제(바이러스 또는 웜)(Replicating Malicious Code (Virus or Worm))](https://cwe.mitre.org/data/definitions/509.html) -* [CWE-509 Replicating Malicious Code (Virus or Worm)](https://cwe.mitre.org/data/definitions/509.html) +* [CWE-565 검증 및 무결성 검사 없이 쿠키에 의존(Reliance on Cookies without Validation and Integrity Checking)](https://cwe.mitre.org/data/definitions/565.html) -* [CWE-565 Reliance on Cookies without Validation and Integrity Checking](https://cwe.mitre.org/data/definitions/565.html) +* [CWE-784 보안 의사결정에서 검증 및 무결성 검사 없이 쿠키에 의존(Reliance on Cookies without Validation and Integrity Checking in a Security Decision)](https://cwe.mitre.org/data/definitions/784.html) -* [CWE-784 Reliance on Cookies without Validation and Integrity Checking in a Security Decision](https://cwe.mitre.org/data/definitions/784.html) +* [CWE-829 신뢰할 수 없는 통제 영역(Control Sphere)에서 기능 포함(Inclusion of Functionality from Untrusted Control Sphere)](https://cwe.mitre.org/data/definitions/829.html) -* [CWE-829 Inclusion of Functionality from Untrusted Control Sphere](https://cwe.mitre.org/data/definitions/829.html) +* [CWE-830 신뢰할 수 없는 출처로부터의 웹 기능 포함(Inclusion of Web Functionality from an Untrusted Source)](https://cwe.mitre.org/data/definitions/830.html) -* [CWE-830 Inclusion of Web Functionality from an Untrusted Source](https://cwe.mitre.org/data/definitions/830.html) +* [CWE-915 동적으로 결정되는 객체 속성의 부적절하게 통제된 수정(Improperly Controlled Modification of Dynamically-Determined Object Attributes)](https://cwe.mitre.org/data/definitions/915.html) -* [CWE-915 Improperly Controlled Modification of Dynamically-Determined Object Attributes](https://cwe.mitre.org/data/definitions/915.html) - -* [CWE-926 Improper Export of Android Application Components](https://cwe.mitre.org/data/definitions/926.html) +* [CWE-926 Android 애플리케이션 컴포넌트의 부적절한 내보내기(Improper Export of Android Application Components)](https://cwe.mitre.org/data/definitions/926.html) From fdeb8e4042faf42a0fa8d89d9da4189d8c8ce685 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Sat, 3 Jan 2026 10:44:47 +0900 Subject: [PATCH 060/167] Clarify title and content for integrity failures --- 2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index ca39c4a47..3b62c57b9 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -1,8 +1,8 @@ -# A08:2025 소프트웨어 또는 데이터 무결성 실패(오류?) ![icon](../assets/TOP_10_Icons_Final_Software_and_Data_Integrity_Failures.png){: style="height:80px;width:80px" align="right"} +# A08:2025 소프트웨어 또는 데이터 무결성 실패 ![icon](../assets/TOP_10_Icons_Final_Software_and_Data_Integrity_Failures.png){: style="height:80px;width:80px" align="right"} ## 배경. -소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 및 데이터 무결성 오류"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 이 범주는 소프트웨어 공급망 실패(Software Supply Chain Failures)보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 공통 취약점 열거(목록?)(Common Weakness Enumeration, CWE)로는 CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함(Inclusion of Functionality from Untrusted Control Sphere), CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정(Improperly Controlled Modification of Dynamically-Determined Object Attributes), CWE-502: 신뢰할 수 없는 데이터의 역직렬화(Deserialization of Untrusted Data)가 있다. +소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 및 데이터 무결성 실패"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 해당 카테고리는 소프트웨어 공급망 실패(Software Supply Chain Failures)보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 CWE로는 CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함(Inclusion of Functionality from Untrusted Control Sphere), CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정(Improperly Controlled Modification of Dynamically-Determined Object Attributes), CWE-502: 신뢰할 수 없는 데이터의 역직렬화(Deserialization of Untrusted Data)가 있다. ## 점수 표. From a7f9359a0f04fe179bdcd9bcfc82d3a9495dbd7c Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Sat, 3 Jan 2026 10:49:46 +0900 Subject: [PATCH 061/167] Fix translation errors in integrity failures document --- 2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index 3b62c57b9..f092fca13 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -62,7 +62,7 @@ * 디지털 서명 또는 유사한 메커니즘을 사용하여 소프트웨어나 데이터가 예상된 출처에서 왔고 변조되지 않았음을 검증한다. -* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 리포지토리만 사용하도록 보장한다. 위험 수준이 더 높다면, 검증된 내부 "known-good(잘 알려진?)" 리포지토리를 호스팅하는 방안을 고려한다. +* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 리포지토리만 사용하도록 보장한다. 위험 수준이 더 높다면, 검증된 내부 리포지토리를 호스팅하는 방안을 고려한다. * 악성 코드 또는 설정이 소프트웨어 파이프라인에 유입될 가능성을 최소화하기 위해, 코드 및 구성 변경에 대한 검토 절차를 마련한다. * 빌드 및 배포 과정에서 흐르는 코드의 무결성을 보장할 수 있도록, CI/CD 파이프라인에 적절한 분리(격리), 구성, 접근 통제를 적용한다. * 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 수신된 뒤, 변조 또는 재전송(replay)을 탐지하기 위한 무결성 검사나 디지털 서명 없이 사용되지 않도록 보장한다. @@ -70,7 +70,7 @@ ## 공격 시나리오 예시. -**시나리오 #1 신뢰할 수 없는 출처로부터의 웹 기능 포함(포괄?):** 한 회사가 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 지원 제공업체로 전송된다. 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. +**시나리오 #1 신뢰할 수 없는 출처로부터의 웹 기능 포함:** 한 회사가 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 지원 제공업체로 전송된다. 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. **시나리오 #2 서명 없이 업데이트:** 많은 가정용 라우터, 셋톱박스, 장치 펌웨어 등은 서명된 펌웨어를 통해 업데이트를 검증하지 않는다. 서명되지 않은 펌웨어는 공격자에게 점점 더 매력적인 표적이 되고 있으며, 앞으로도 악화될 것으로 예상된다. 이는 대개 향후 버전에서 수정한 뒤 이전 버전이 자연스럽게 도태될 때까지 기다리는 것 외에는 별도의 개선(리미디에이션) 메커니즘이 없는 경우가 많다는 점에서 큰 우려 사항이다. From 479f246ab2c08152162033a1890884a3727b1993 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Sat, 3 Jan 2026 10:52:49 +0900 Subject: [PATCH 062/167] =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20->=20=EC=A0=80=EC=9E=A5=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index f092fca13..b7b85bc1f 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -55,14 +55,14 @@ ## 설명. -소프트웨어 및 데이터 무결성 실패는 유효하지 않거나 신뢰할 수 없는 코드 또는 데이터가 신뢰할 수 있고 유효한 것으로 취급되는 것을 방지하지 못하는 코드 및 인프라와 관련된다. 예를 들어, 애플리케이션이 신뢰할 수 없는 출처, 리포지토리, 콘텐츠 전송 네트워크(CDN)에서 제공되는 플러그인, 라이브러리, 모듈에 의존하는 경우가 이에 해당한다. 소프트웨어 무결성 검증을 수행하지 않거나(원:소비하지 않거나) 제공하지 않는 불안전한 CI/CD 파이프라인은 비인가 접근, 불안전하거나 악성인 코드, 또는 시스템 손상으로 이어질 잠재적 위험을 초래할 수 있다. 또 다른 예로, CI/CD가 신뢰할 수 없는 위치에서 코드나 아티팩트를 가져오고, 사용 전에 서명 확인 등 유사한 메커니즘으로 이를 검증하지 않는 경우가 있다. 마지막으로, 많은 애플리케이션에는 자동 업데이트 기능이 포함되어 있는데, 업데이트가 충분한 무결성 검증 없이 다운로드되어 이전에 신뢰하던 애플리케이션에 적용될 수 있다. 공격자는 자신의 업데이트를 업로드하여 모든 설치본에 배포 및 실행되도록 만들 수도 있다. 또 다른 예로, 객체나 데이터가 공격자가 보고 수정할 수 있는 구조로 인코딩되거나 직렬화되는 경우, 불안전한 역직렬화(insecure deserialization)에 취약해질 수 있다. +소프트웨어 및 데이터 무결성 실패는 유효하지 않거나 신뢰할 수 없는 코드 또는 데이터가 신뢰할 수 있고 유효한 것으로 취급되는 것을 방지하지 못하는 코드 및 인프라와 관련된다. 예를 들어, 애플리케이션이 신뢰할 수 없는 출처, 저장소, 콘텐츠 전송 네트워크(CDN)에서 제공되는 플러그인, 라이브러리, 모듈에 의존하는 경우가 이에 해당한다. 소프트웨어 무결성 검증을 수행하지 않거나(원:소비하지 않거나) 제공하지 않는 불안전한 CI/CD 파이프라인은 비인가 접근, 불안전하거나 악성인 코드, 또는 시스템 손상으로 이어질 잠재적 위험을 초래할 수 있다. 또 다른 예로, CI/CD가 신뢰할 수 없는 위치에서 코드나 아티팩트를 가져오고, 사용 전에 서명 확인 등 유사한 메커니즘으로 이를 검증하지 않는 경우가 있다. 마지막으로, 많은 애플리케이션에는 자동 업데이트 기능이 포함되어 있는데, 업데이트가 충분한 무결성 검증 없이 다운로드되어 이전에 신뢰하던 애플리케이션에 적용될 수 있다. 공격자는 자신의 업데이트를 업로드하여 모든 설치본에 배포 및 실행되도록 만들 수도 있다. 또 다른 예로, 객체나 데이터가 공격자가 보고 수정할 수 있는 구조로 인코딩되거나 직렬화되는 경우, 불안전한 역직렬화(insecure deserialization)에 취약해질 수 있다. ## 예방 방법. * 디지털 서명 또는 유사한 메커니즘을 사용하여 소프트웨어나 데이터가 예상된 출처에서 왔고 변조되지 않았음을 검증한다. -* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 리포지토리만 사용하도록 보장한다. 위험 수준이 더 높다면, 검증된 내부 리포지토리를 호스팅하는 방안을 고려한다. +* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 저장소만 사용하도록 보장한다. 위험 수준이 더 높다면, 검증된 내부 저장소를 호스팅하는 방안을 고려한다. * 악성 코드 또는 설정이 소프트웨어 파이프라인에 유입될 가능성을 최소화하기 위해, 코드 및 구성 변경에 대한 검토 절차를 마련한다. * 빌드 및 배포 과정에서 흐르는 코드의 무결성을 보장할 수 있도록, CI/CD 파이프라인에 적절한 분리(격리), 구성, 접근 통제를 적용한다. * 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 수신된 뒤, 변조 또는 재전송(replay)을 탐지하기 위한 무결성 검사나 디지털 서명 없이 사용되지 않도록 보장한다. From 6bf749500e433b854df4eac21b5db21ad27bdcef Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Sat, 3 Jan 2026 23:21:21 +0900 Subject: [PATCH 063/167] typo --- ...3_2025-Establishing_a_Modern_Application_Security_Program.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index a5401c89b..0966934fc 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -297,6 +297,6 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리
CWEs Mapped + 매핑된 CWE 수 Max Incidence Rate + 최대 발생률 Avg Incidence Rate + 평균 발생률 Max Coverage + 최대 커버리지 Avg Coverage + 평균 커버리지 Avg Weighted Exploit + 평균 가중 악용 Avg Weighted Impact + 평균 가중 영향 Total Occurrences + 총 발생 건수 Total CVEs + 총 CVE 수
-애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능 하게 정의하도록 설계되었고 보안 안전한 안전한 개발 주기(SDL) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)]((https://owasp.org/www-project-application-security-verification-standard/))를 기준으로 활용하는 것을 권고한다. +애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능 하게 정의하도록 설계되었고 보안 안전한 안전한 개발 주기(SDLC) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)]((https://owasp.org/www-project-application-security-verification-standard/))를 기준으로 활용하는 것을 권고한다. 특히 보안 도구 벤더 관점에서는 ASVS를 기준으로 삼는 것이 유일한 선택지이다. OWASP Top 10은 위험 중심으로 구성되어 있기에, [A06:2025 - Insecure Design](A06_2025-Insecure_Design.md) 사례와 마찬가지로 자동화 도구만으로 모든 Top 10 항목을 포괄적으로 탐지, 테스트, 방어하기 어렵다. 따라서, OWASP는 Top 10을 전부 보장한다는 주장을 지양하도록 안내한다. From 079592e0de4353e133b3fffc6a4303b0c3db67b3 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 00:30:11 +0900 Subject: [PATCH 064/167] Translate A06:2025 Insecure Design document to Korean --- 2025/docs/ko/A06_2025-Insecure_Design.md | 87 ++++++++++++------------ 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index aaf212113..38300436a 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -1,33 +1,34 @@ -# A06:2025 Insecure Design ![icon](../assets/TOP_10_Icons_Final_Insecure_Design.png){: style="height:80px;width:80px" align="right"} +# A06:2025 안전하지 않은 설계 ![icon](../assets/TOP_10_Icons_Final_Insecure_Design.png){: style="height:80px;width:80px" align="right"} -## Background. +## 배경. -Insecure Design slides two spots from #4 to #6 in the ranking as **[A02:2025-Security Misconfiguration](A02_2025-Security_Misconfiguration.md)** and **[A03:2025-Software Supply Chain Failures](A03_2025-Software_Supply_Chain_Failures.md)** leapfrog it. This category was introduced in 2021, and we have seen noticeable improvements in the industry related to threat modeling and a greater emphasis on secure design. This category focuses on risks related to design and architectural flaws, with a call for more use of threat modeling, secure design patterns, and reference architectures. This includes flaws in the business logic of an application, e.g. the lack of defining unwanted or unexpected state changes inside an application. As a community, we need to move beyond "shift-left" in the coding space, to pre-code activities such as requirements writing and application design, that are critical for the principles of Secure by Design (e.g. see **[Establish a Modern AppSec Program: Planning and Design Phase](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**). Notable Common Weakness Enumerations (CWEs) include *CWE-256: Unprotected Storage of Credentials, CWE-269 Improper Privilege Management, CWE-434 Unrestricted Upload of File with Dangerous Type, CWE-501: Trust Boundary Violation, and CWE-522: Insufficiently Protected Credentials.* +안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위으로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 의도하지 않은 단계로 시스템 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, Secure by Design의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장 해야한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*가 있다. -## Score table. + +## 점수표. - - - - - - - - - @@ -54,59 +55,59 @@ Insecure Design slides two spots from #4 to #6 in the ranking as **[A02:2025-Sec -## Description. - -Insecure design is a broad category representing different weaknesses, expressed as “missing or ineffective control design.” Insecure design is not the source for all other Top Ten risk categories. Note that there is a difference between insecure design and insecure implementation. We differentiate between design flaws and implementation defects for a reason, they have different root causes, take place at different times in the development process, and have different remediations. A secure design can still have implementation defects leading to vulnerabilities that may be exploited. An insecure design cannot be fixed by a perfect implementation as needed security controls were never created to defend against specific attacks. One of the factors that contributes to insecure design is the lack of business risk profiling inherent in the software or system being developed, and thus the failure to determine what level of security design is required. +## 설명. -Three key parts of having a secure design are: +안전하지 않은 설계는 다양한 유형의 약점을 포괄하는 범주로, 주로 "빠졌거나 비효과적인 통제 설계"로 나타난다. 또한 이 카테고리가 다른 모든 Top 10 위험의 근본 원인이라고 보기는 어렵다. 안전하지 않은 설계와 안전하지 않은 구현은 차이가 있다. 안전하지 않은 설계와 안전하지 않은 구현은 구분되어야 하며, 설계 결함과 구현 결함은 근본 원인이 다르며, 개발 과정에 발생 시점이 다르며, 그리고 개선 방법이 서로 다르다. 안전한 설계를 하더라도 구현상 결함을 가질 수 있으며, 이에 따라 취약점이 발생할 수 있다. 안전하지 않은 설계는 필요한 보안 통제가 특정 공격에 대해 방어하기 위해 대비되지 않았기 때문에, 완벽한 구현만으로는 수정될 수 없다. 안전하지 않은 설계의 원인 중 하나는 개발 대상 소프트웨어 및 시스템에 대한 비즈니스 리스크 프로파일링이 부족한 것이며, 그 결과 요구되는 보안 설계 수준을 적절히 산정하지 못하는 것이다. -* Gathering Requirements and Resource Management -* Creating a Secure Design -* Having a Secure Development Lifecycle +보안 설계를 갖추는 데의 세 가지 핵심 구성요소는 다음과 같다. +* 요구사항 수집 및 리소스 관리 +* 안전한 설계 수립 +* 보안 개발 생명주기(Secure Development Lifecycle, SDLC) 보유 -### Requirements and Resource Management -Collect and negotiate the business requirements for an application with the business, including the protection requirements concerning confidentiality, integrity, availability, and authenticity of all data assets and the expected business logic. Take into account how exposed your application will be and if you need segregation of tenants (beyond those needed for access control). Compile the technical requirements, including functional and non-functional security requirements. Plan and negotiate the budget covering all design, build, testing, and operation, including security activities. +### 요구사항 수집 및 리소스 관리 +비즈니스 부서와 협업하여 애플리케이션의 비즈니스 요구사항을 수집 및 조율하며, 모든 데이터 자산과 예상되는 비즈니스 로직에 대해 기밀성, 무결성, 가용성, 인증성 관점의 보호 요구사항을 함께 정의한다. 애플리케이션의 대외 노출 수준을 고려하고, 그리고 단순 접근 제어 수준을 넘어서는 테넌트 격리가 필요한지 아닌지를 고려하라. 기능 요구사항뿐 아니라 비기능 보안 요구사항까지 포함해 기술 요구사항을 정리한다. 보안 활동을 포함하여 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의하라. 또한, 보안 활동을 포함한 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의하라. -### Secure Design -Secure design is a culture and methodology that constantly evaluates threats and ensures that code is robustly designed and tested to prevent known attack methods. Threat modeling should be integrated into refinement sessions (or similar activities); look for changes in data flows and access control or other security controls. In the user story development, determine the correct flow and failure states, ensure they are well understood and agreed upon by the responsible and impacted parties. Analyze assumptions and conditions for expected and failure flows to ensure they remain accurate and desirable. Determine how to validate the assumptions and enforce conditions needed for proper behaviors. Ensure the results are documented in the user story. Learn from mistakes and offer positive incentives to promote improvements. Secure design is neither an add-on nor a tool that you can add to software. +### 안전한 설계 +안전한 설계는 지속적으로 위협을 평가하고, 알려진 공격 기법을 방지하기 위해 코드가 견고하게 설계되고 테스트 되도록 보장하는 문화이자 방법론이다. 위협 모델링은 요구사항 개선(refinement) 단계(혹은 유사한 활동)에 내재화되어야 하며, 이 과정에서 데이터 흐름과 접근 제어 또는 기타 보안 통제의 변화를 중심으로 검토해야 한다. 유저 스토리를 작성할 때 정상 흐름과 실패 흐름을 결정하고, 책임 당사자 및 영향받는 당사자가 이를 충분히 이해하고 합의했는지 확인하라. 또한 정상과 실패 흐름에 대한 가정과 조건을 분석하여 정확하고 바람직한 상태로 유지되는지 확인하라. 올바른 동작을 위해 필요한 가정과 조건을 어떻게 검증하고 강제할지 결정한다. 이 결과는 유저 스토리에 문서로 만들어져야 한다. 과정 중에 발생하는 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공하라. 마지막으로, 안전한 설계는 개발이 완료된 이후에 추가할 수 있는 부가 기능도 아니고 도구도 아니다. -### Secure Development Lifecycle -Secure software requires a secure development lifecycle, a secure design pattern, a paved road methodology, a secure component library, appropriate tooling, threat modeling, and incident post-mortems that are used to improve the process. Reach out to your security specialists at the beginning of a software project, throughout the project, and for ongoing software maintenance. Consider leveraging the [OWASP Software Assurance Maturity Model (SAMM)](https://owaspsamm.org/) to help structure your secure software development efforts. +### 보안 개발 생명주기 -Often self-responsibility of developers is underappreciated. Foster a culture of awareness, responsibility and proactive risk mitigation. Regular exchanges about security (e.g. during threat modeling sessions) can generate a mindset for including security in all important design decisions. +안전한 소프트웨어에는 보안 개발 생명주기, 안전한 설계 패턴, 포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것) 방법론, 안전한 컴포넌트 라이브러리, 적절한 도구, 위협 모델링, 그리고 프로세스를 개선하기 위해 사용되는 사고 포스트모템(post-mortem)이 필요하다. 소프트웨어 프로젝트 초기부터 보안 전문가와 협업하고, 개발 전체 과정 및 소프트웨어 유지보수 단계에서도 지속적으로 협업해야 한다. 보안 개발 활동을 체계화하기 위해 [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM](https://owaspsamm.org/)와 같은 성숙도 모델을 참고하는 방안을 고려하라. +개발자가 보안에 대해 주도적으로 책임져야 한다는 인식이 종종 부족하다. 보안 인식과 책임감을 강화하고, 위험을 사전에 완화하려는 문화를 조성하라. 보안에 관한 정기적인 교류(예: 위협 모델링 세션 도중)는 모든 중요한 설계 의사결정에 보안을 포함시키기 위한 마인드셋을 형성할 수 있다. -## How to prevent. +## 대응 방안. -* Establish and use a secure development lifecycle with AppSec professionals to help evaluate and design security and privacy-related controls -* Establish and use a library of secure design patterns or paved-road components -* Use threat modeling for critical parts of the application such as authentication, access control, business logic, and key flows -* User threat modeling as an educational tool to generate a security mindset -* Integrate security language and controls into user stories -* Integrate plausibility checks at each tier of your application (from frontend to backend) -* Write unit and integration tests to validate that all critical flows are resistant to the threat model. Compile use-cases *and* misuse-cases for each tier of your application. -* Segregate tier layers on the system and network layers, depending on the exposure and protection needs -* Segregate tenants robustly by design throughout all tiers +* 보안 및 프라이버시 관련 통제를 평가하고 설계하는 데 도움받기 위해 애플리케이션 보안 전문가와 함께 안전한 개발 생명주기(SDLC)를 수립하고 운영하라. +* 안전한 설계 패턴과 포장된 도로 컴포넌트를 라이브러리화하여 사용한다. +* 인증, 접근 제어, 비즈니스 로직, 핵심 처리 흐름과 같은 애플리케이션의 중요한 부분을 위협 모델링한다. +* 보안 마인드셋을 생성하기 위한 교육 도구로서 위협 모델링을 사용하라. +* 유저 스토리에 보안 요구사항과 보안 통제를 반영하라. +* 애플리케이션의 각 계층(프론트엔드부터 백엔드까지)에 요청과 데이터가 타당한지 검증하는 절차를 추가한다. +* 위협 모델에 기반해 핵심 흐름의 안전한지 검증하는 단위 및 통합 테스트를 구현하고, 애플리케이션 계층별 정상 시나리오*와* 악용 시나리오를 취합한다. +* 외부 노출 수준과 보호 필요도에 따라 시스템 및 네트워크 레벨에서 분리한다. +* 전 계층에 걸쳐 설계 단계부터 테넌트 격리(tenant isolation)를 강하게 보장한다. +* 전 계층에서 테넌트를 구조적으로 격리되도록 하라. -## Example attack scenarios. +## 공격 시나리오 예시. -**Scenario #1:** A credential recovery workflow might include “questions and answers,” which is prohibited by NIST 800-63b, the OWASP ASVS, and the OWASP Top 10. Questions and answers cannot be trusted as evidence of identity, as more than one person can know the answers. Such functionality should be removed and replaced with a more secure design. +**시나리오 1:** 계정 복구 절차에 "질문-답변 방식"을 넣는 경우가 있는데, 이는 NIST 800-63b, OWASP ASVS 및 OWASP Top 10에서 금지하는 설계다. 질문-답변은 여러 사람이 답을 알고 있을 수 있어 본인 확인의 근거로 신뢰하기 어렵다. 따라서 해당 기능은 제거하고, 보다 안전한 복구 설계로 대체하는 것이 바람직하다. -**Scenario #2:** A cinema chain allows group booking discounts and has a maximum of fifteen attendees before requiring a deposit. Attackers could threat model this flow and test if they can find an attack vector in the business logic of the application, e.g. booking six hundred seats and all cinemas at once in a few requests, causing a massive loss of income. +**시나리오 2:** 영화관 체인이 단체 예매 할인 정책을 운용하며, 참석 인원이 15명을 초과하면 보증금을 요구한다고 가정한다. 공격자는 이 예약 흐름을 위협 모델링한 뒤 비즈니스 로직의 허점을 찾아, 예컨대 소수의 요청(15명 이하로 여러 번)만으로 지점의 전체 좌석을 대량으로 선점해 매출 손실을 유발할 수 있다. -**Scenario #3:** A retail chain’s e-commerce website does not have protection against bots run by scalpers buying high-end video cards to resell on auction websites. This creates terrible publicity for the video card makers and retail chain owners, and enduring bad blood with enthusiasts who cannot obtain these cards at any price. Careful anti-bot design and domain logic rules, such as purchases made within a few seconds of availability, might identify inauthentic purchases and reject such transactions. +**시나리오 3:** 한 유통 체인의 전자상거래 사이트가 리셀러 구매 봇을 차단하지 못하면, 고가 그래픽카드가 대량 매집되어 리셀 채널로 흘러갈 수 있다. 이는 제조사와 유통사 모두에 대한 부정적 여론을 초래하고, 해당 제품을 어떤 가격에서도 구할 수 없었던 마니아층의 반감을 장기화한다. 제품 판매 개시 직후 극단적으로 짧은 시간 내 구매, 비정상 다량 구매 등 도메인 규칙 기반의 봇 방어 설계를 적용하면, 비정상 구매를 탐지해 거래를 거절할 수 있다. -## References. +## 참조. @@ -118,7 +119,7 @@ Often self-responsibility of developers is underappreciated. Foster a culture of * [Awesome Threat Modeling](https://github.com/hysnsec/awesome-threat-modelling) -## List of Mapped CWEs +## 해당되는 CWE 목록. * [CWE-73 External Control of File Name or Path](https://cwe.mitre.org/data/definitions/73.html) From fd597d19620e5f65cac2fa160fa1a1ce75e60214 Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Sun, 4 Jan 2026 00:30:30 +0900 Subject: [PATCH 065/167] typo --- 2025/docs/ko/A05_2025-Injection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index 2a2c51e05..6f6cceeba 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -131,7 +131,7 @@ Runtime.getRuntime().exec(cmd); -## 해당되는 CWE. +## 해당되는 CWE 목록. * [CWE-20 Improper Input Validation](https://cwe.mitre.org/data/definitions/20.html) From 92ac9e3bba1328d9375a160d82fc1d2972a3e967 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 00:31:38 +0900 Subject: [PATCH 066/167] Added a07 file in the ko directory --- .../ko/A07_2025-Authentication_Failures.md | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 2025/docs/ko/A07_2025-Authentication_Failures.md diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md new file mode 100644 index 000000000..2d3077107 --- /dev/null +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -0,0 +1,199 @@ +# A07:2025 Authentication Failures ![icon](../assets/TOP_10_Icons_Final_Identification_and_Authentication_Failures.png){: style="height:80px;width:80px" align="right"} + + +## Background. + +Authentication Failures maintains its position at #7 with a slight name change to more accurately reflect the 36 CWEs in this category. Despite benefits from standardized frameworks, this category has kept its #7 rank from 2021. Notable CWEs included are *CWE-259 Use of Hard-coded Password*, *CWE-297: Improper Validation of Certificate with Host Mismatch*, *CWE-287: Improper Authentication*, *CWE-384: Session Fixation*, and *CWE-798 Use of Hard-coded Credentials*. + + +## Score table. + + +
CWEs Mapped + 해당되는 CWE 개수 Max Incidence Rate + 최대 취약점 발생률 Avg Incidence Rate + 평균 취약점 발생률 Max Coverage + 최대 테스트 커버리지 Avg Coverage + 평균 테스트 커버리지 Avg Weighted Exploit + 평균 가중 악용도 Avg Weighted Impact + 평균 가중 영향도 Total Occurrences + 총 발생 건수 Total CVEs + 총 CVE 건수
+ + + + + + + + + + + + + + + + + + + + + + +
CWEs Mapped + Max Incidence Rate + Avg Incidence Rate + Max Coverage + Avg Coverage + Avg Weighted Exploit + Avg Weighted Impact + Total Occurrences + Total CVEs +
36 + 15.80% + 2.92% + 100.00% + 37.14% + 7.69 + 4.44 + 1,120,673 + 7,147 +
+ + + +## Description. + +When an attacker is able to trick a system into recognizing an invalid or incorrect user as legitimate, this vulnerability is present. There may be authentication weaknesses if the application: + +* Permits automated attacks such as credential stuffing, where the attacker has a breached list of valid usernames and passwords. More recently this type of attack has been expanded to include hybrid password attacks credential stuffing (also known as password spray attacks), where the attacker uses variations or increments of spilled credentials to gain access, for instance trying Password1!, Password2!, Password3! and so on. + +* Permits brute force or other automated, scripted attacks that are not quickly blocked. + +* Permits default, weak, or well-known passwords, such as "Password1" or "admin" username with an "admin" password. + +* Allows users to create new accounts with already known-breached credentials. + +* Allows use of weak or ineffective credential recovery and forgot-password processes, such as "knowledge-based answers," which cannot be made safe. + +* Uses plain text, encrypted, or weakly hashed passwords data stores (see[ A04:2025-Cryptographic Failures](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/)). + +* Has missing or ineffective multi-factor authentication. + +* Allows use of weak or ineffective fallbacks if multi-factor authentication is not available. + +* Exposes session identifier in the URL, a hidden field, or another insecure location that is accessible to the client. + +* Reuses the same session identifier after successful login. + +* Does not correctly invalidate user sessions or authentication tokens (mainly single sign-on (SSO) tokens) during logout or a period of inactivity. + +* Does not correctly assert the scope and intended audience of the provided credentials. + +## How to prevent. + +* Where possible, implement and enforce use of multi-factor authentication to prevent automated credential stuffing, brute force, and stolen credential reuse attacks. + +* Where possible, encourage and enable the use of password managers, to help users make better choices. + +* Do not ship or deploy with any default credentials, particularly for admin users. + +* Implement weak password checks, such as testing new or changed passwords against the top 10,000 worst passwords list. + +* During new account creation and password changes validate against lists of known breached credentials (eg: using [haveibeenpwned.com](https://haveibeenpwned.com)). + +* Align password length, complexity, and rotation policies with [National Institute of Standards and Technology (NIST) 800-63b's guidelines in section 5.1.1](https://pages.nist.gov/800-63-3/sp800-63b.html#:~:text=5.1.1%20Memorized%20Secrets) for Memorized Secrets or other modern, evidence-based password policies. + +* Do not force human beings to rotate passwords unless you suspect breach. If you suspect breach, force password resets immediately. + +* Ensure registration, credential recovery, and API pathways are hardened against account enumeration attacks by using the same messages for all outcomes (“Invalid username or password.”). + +* Limit or increasingly delay failed login attempts but be careful not to create a denial of service scenario. Log all failures and alert administrators when credential stuffing, brute force, or other attacks are detected or suspected. + +* Use a server-side, secure, built-in session manager that generates a new random session ID with high entropy after login. Session identifiers should not be in the URL, be securely stored in a secure cookie, and invalidated after logout, idle, and absolute timeouts. + +* Ideally, use a premade, well-trusted system to handle authentication, identity, and session management. Transfer this risk whenever possible by buying and utilizing a hardened and well tested system. + +* Verify the intended use of provided credentials, e.g. for JWTs validate `aud`, `iss` claims and scopes + + +## Example attack scenarios. + +**Scenario #1:** Credential stuffing, the use of lists of known username and password combinations, is now a very common attack. More recently attackers have been found to ‘increment’ or otherwise adjust passwords, based on common human behavior. For instance, changing ‘Winter2025’ to ‘Winter2026’, or ‘ILoveMyDog6’ to ‘ILoveMyDog7’ or ‘ILoveMyDog5’. This adjusting of password attempts is called a hybrid credential stuffing attack or a password spray attack, and they can be even more effective than the traditional version. If an application does not implement defences against automated threats (brute force, scripts, or bots) or credential stuffing, the application can be used as a password oracle to determine if the credentials are valid and gain unauthorized access. + +**Scenario #2:** Most successful authentication attacks occur due to the continued use of passwords as the sole authentication factor. Once considered best practices, password rotation and complexity requirements encourage users to both reuse passwords and use weak passwords. Organizations are recommended to stop these practices per NIST 800-63 and to enforce use of multi-factor authentication on all important systems. + +**Scenario #3:** Application session timeouts aren't implemented correctly. A user uses a public computer to access an application and instead of selecting "logout," the user simply closes the browser tab and walks away. Another Example for this is, if a Single Sign on (SSO) session can not be closed by a Single Logout (SLO). That is, a single login logs you into, for example, your mail reader, your document system, and your chat system. But logging out happens only to the current system. If an attacker uses the same browser after the victim thinks they have successfully logged out, but with the user still authenticated to some of the applications, then can access the victim's account. The same issue can happen in offices and enterprises when a sensitive application has not been properly exited and a colleague has (temporary) access to the unlocked computer. + +## References. + +* [OWASP Authentication Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html) + +* [OWASP Secure Coding Practices](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/stable-en/01-introduction/05-introduction) + + +## List of Mapped CWEs + +* [CWE-258 Empty Password in Configuration File](https://cwe.mitre.org/data/definitions/258.html) + +* [CWE-259 Use of Hard-coded Password](https://cwe.mitre.org/data/definitions/259.html) + +* [CWE-287 Improper Authentication](https://cwe.mitre.org/data/definitions/287.html) + +* [CWE-288 Authentication Bypass Using an Alternate Path or Channel](https://cwe.mitre.org/data/definitions/288.html) + +* [CWE-289 Authentication Bypass by Alternate Name](https://cwe.mitre.org/data/definitions/289.html) + +* [CWE-290 Authentication Bypass by Spoofing](https://cwe.mitre.org/data/definitions/290.html) + +* [CWE-291 Reliance on IP Address for Authentication](https://cwe.mitre.org/data/definitions/291.html) + +* [CWE-293 Using Referer Field for Authentication](https://cwe.mitre.org/data/definitions/293.html) + +* [CWE-294 Authentication Bypass by Capture-replay](https://cwe.mitre.org/data/definitions/294.html) + +* [CWE-295 Improper Certificate Validation](https://cwe.mitre.org/data/definitions/295.html) + +* [CWE-297 Improper Validation of Certificate with Host Mismatch](https://cwe.mitre.org/data/definitions/297.html) + +* [CWE-298 Improper Validation of Certificate with Host Mismatch](https://cwe.mitre.org/data/definitions/298.html) + +* [CWE-299 Improper Validation of Certificate with Host Mismatch](https://cwe.mitre.org/data/definitions/299.html) + +* [CWE-300 Channel Accessible by Non-Endpoint](https://cwe.mitre.org/data/definitions/300.html) + +* [CWE-302 Authentication Bypass by Assumed-Immutable Data](https://cwe.mitre.org/data/definitions/302.html) + +* [CWE-303 Incorrect Implementation of Authentication Algorithm](https://cwe.mitre.org/data/definitions/303.html) + +* [CWE-304 Missing Critical Step in Authentication](https://cwe.mitre.org/data/definitions/304.html) + +* [CWE-305 Authentication Bypass by Primary Weakness](https://cwe.mitre.org/data/definitions/305.html) + +* [CWE-306 Missing Authentication for Critical Function](https://cwe.mitre.org/data/definitions/306.html) + +* [CWE-307 Improper Restriction of Excessive Authentication Attempts](https://cwe.mitre.org/data/definitions/307.html) + +* [CWE-308 Use of Single-factor Authentication](https://cwe.mitre.org/data/definitions/308.html) + +* [CWE-309 Use of Password System for Primary Authentication](https://cwe.mitre.org/data/definitions/309.html) + +* [CWE-346 Origin Validation Error](https://cwe.mitre.org/data/definitions/346.html) + +* [CWE-350 Reliance on Reverse DNS Resolution for a Security-Critical Action](https://cwe.mitre.org/data/definitions/350.html) + +* [CWE-384 Session Fixation](https://cwe.mitre.org/data/definitions/384.html) + +* [CWE-521 Weak Password Requirements](https://cwe.mitre.org/data/definitions/521.html) + +* [CWE-613 Insufficient Session Expiration](https://cwe.mitre.org/data/definitions/613.html) + +* [CWE-620 Unverified Password Change](https://cwe.mitre.org/data/definitions/620.html) + +* [CWE-640 Weak Password Recovery Mechanism for Forgotten Password](https://cwe.mitre.org/data/definitions/640.html) + +* [CWE-798 Use of Hard-coded Credentials](https://cwe.mitre.org/data/definitions/798.html) + +* [CWE-940 Improper Verification of Source of a Communication Channel](https://cwe.mitre.org/data/definitions/940.html) + +* [CWE-941 Incorrectly Specified Destination in a Communication Channel](https://cwe.mitre.org/data/definitions/941.html) + +* [CWE-1390 Weak Authentication](https://cwe.mitre.org/data/definitions/1390.html) + +* [CWE-1391 Use of Weak Credentials](https://cwe.mitre.org/data/definitions/1391.html) + +* [CWE-1392 Use of Default Credentials](https://cwe.mitre.org/data/definitions/1392.html) + +* [CWE-1393 Use of Default Password](https://cwe.mitre.org/data/definitions/1393.html) From 17a35396a730a2958b72c6ddfc70315a2016e7e7 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Sun, 4 Jan 2026 00:57:08 +0900 Subject: [PATCH 067/167] A01 Broken access control --- .../docs/ko/A01_2025-Broken_Access_Control.md | 219 ++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 2025/docs/ko/A01_2025-Broken_Access_Control.md diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md new file mode 100644 index 000000000..e50507dc8 --- /dev/null +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -0,0 +1,219 @@ +# A01:2025 불충분한 접근 제어![icon](../assets/TOP_10_Icons_Final_Broken_Access_Control.png){: style="height:80px;width:80px" align="right"} + + + +## 배경. + +불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할만한 CWE는 CWE-200: 비인기자에게 민감정보 노출, CWE-201: 전송된 데이터로부터의 민감정보 노출, `CWE-918: 서버측 요청 위조(SSRF)`, 그리고 `CWE-352: 크로스 사이트 요청 위조(CSRF)` 가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. + +## 점수표. + + + + + + + + + + + + + + + + + + + + + + + + + +
해당되는 CWE 개수 + 최대 취약점 발생률 + 평균 취약점 발생률 + 최대 테스트 커버리지 + 평균 테스트 커버리지 + 가중 평균 악용도 + 가중 평균 영향도 + 총 발생 건수 + 총 CVE 건수 +
40 + 20.15% + 3.74% + 100.00% + 42.93% + 7.04 + 3.84 + 1,839,701 + 32,654 +
+ + + +## 설명. + +접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 접근 제어 실패는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제(파괴), 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔히 발견되는 불충분한 접근 제어 취약점은 목록은 다음과 같다. + +* 최소 권한 원칙 위반, 우선 거부 정책(Deny by Default)이 적용되지 않아 제한된 기능, 역할, 사용자들에게만 허용된 접근 권한이 불특정 다수에게 허용되는 경우. +* 조작된 URL(파라미터 변조 또는 강제 브라우징), 애플리케이션 내부 상태값 변조, HTML 페이지 조작 또는 공격 도구를 통해 API 요청을 조작함으로써 접근 제어 검사 우회가 가능한 경우 +* 고유 식별자를 이용해 권한이 필요한 다른 사용자 계정을 조회 또는 수정할 수 있는 경우(안전하지 않은 직접 객체 참조, Insecure Direct Object References) +* 접근 가능한 API의 POST, PUT, DELETE 메서드에 대한 접근 제어가 없는 경우 +* 권한 상승. 로그인 과정 없이 다른 사용자로 가장하거나 또는 사용자가 보유한 이상의 권한을 획득하는 경우. (예시. 관리자 접근 권한) +* 메타데이터 조작, 예를 들어 JWT 토큰, 접근 통제 토큰, 쿠키 또는 히든 필드 값을 수정하여 재전송 하거나 위조하여 권한 상승하는 경우 또는 JWT 무효화가 없거나 우회하여 악용하는 경우 +* 교차 출처 리소스 공유 (Cross-Origin Resource Sharing, CORS)의 잘못된 설정으로 비인가자 또는 신뢰할 수 없는 출처(Origin)로부터 API 접근을 허용하는 경우 +* 강제 브라우징 (URL 예측)을 통해 인증이 필요한 페이지에 인증없이 접근하거나, 일반 사용자가 권한이 필요한 페이지에 접근할 경우 + + +## 대응 방안. + +접근 제어는 공격자가 접근 제어 검사나 메타데이터를 변조할 수 없는 곳에서 신뢰할 수 있는 서버측 코드나 서버리스 API들로 수행될 때 실효성이 있다. + + + +* 공개 리소스 제외 모든 리소스는 우선 거부 정책(Deny By Default)을 따라야 한다. +* 접근제어 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 리소스 검증(CORS) 사용을 최소화 한다. +* 모델 수준의 접근 제어는 레코드 소유자 기준으로 접근 권한을 제한하도록 한다. 다른 사용자가 임의의 레코드에 대해 생성, 조회, 수정, 삭제를 수행하도록 하지 못하게 한다. +* 애플리케이션의 고유한 비즈니스 제약사항은 도메인 모델에 의해 검사한다. +* 웹 서버 디렉토리 리스팅 비활성화 여부와 웹 루트에 파일 메타데이터 및 (예시. .git 디렉토리) 백업 파일이 존재하지 않는지 확인한다. +* 접근 제어 실패를 로깅하고 필요한 경우엔 관리자에게 알린다. (예시. 반복적 실패 또는 비정상적 접근 시도) +* 자동화된 공격 도구로 인한 피해를 최소화하기 위해 API 및 컨트롤러 접근에 대한 속도 제한(Rate limit)을 구현한다. +* 상태기반 세션 식별자는 로그아웃 후 무효화 한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격을 위한 기회를 최소화하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려하며, OAuth 표준에 따른 토큰 취소도 고려한다. +* 간단하고 선언적 접근 제어를 제공하는 확립된 툴킷과 패턴을 사용한다. + +개발자와 QA 담당자는 단위 및 통합 테스트에서 접근 제어를 포함해야 한다. + +## 공격 시나리오 예시. + +**시나리오 1:** 이 기능은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다. + + +``` +pstmt.setString(1, request.getParameter("acct")); +ResultSet results = pstmt.executeQuery( ); +``` + + +공격자는 원하는 계정 정보를 전달하기 위해 단순하게 'acct' 파라미터를 변조할 수 있으며, 만약 해당 파라미터가 완벽하게 검증되지 않았을 시 공격자는 모든 사용자 계정 정보에 접근 가능하다. + + +``` +https://example.com/app/accountInfo?acct=notmyacct +``` + + +**시나리오 2:** 공격자는 단순하게 목적 URL로 브라우저를 이용해 접속할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. + + +``` +https://example.com/app/getappInfo +https://example.com/app/admin_getappInfo +``` + + +먄약 인증되지 않은 사용자가 두 페이지 중 하나에 접근할 수 있다면, 보안 취약점으로 간주한다. 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이 또한 마찬가지다. + + +**시나리오 3:** 애플리케이션이 모든 접근 제어를 프론트 엔드에서만 구현할 경우. 공격자가 브라우저에서 동작하는 자바 스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없지만, 커멘드 라인에서 단순하게 curl 명령어를 실행하면 접속할 수 있다. + +``` +$ curl https://example.com/app/admin_getappInfo +``` + + + + +## 참조. + +* [OWASP Proactive Controls: C1: Implement Access Control](https://top10proactive.owasp.org/archive/2024/the-top-10/c1-accesscontrol/) +* [OWASP Application Security Verification Standard: V8 Authorization](https://github.com/OWASP/ASVS/blob/master/5.0/en/0x17-V8-Authorization.md) +* [OWASP Testing Guide: Authorization Testing](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/README) +* [OWASP Cheat Sheet: Authorization](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html) +* [PortSwigger: Exploiting CORS misconfiguration](https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties) +* [OAuth: Revoking Access](https://www.oauth.com/oauth2-servers/listing-authorizations/revoking-access/) + + +## 해당되는 CWE. + +* [CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')](https://cwe.mitre.org/data/definitions/22.html) + +* [CWE-23 Relative Path Traversal](https://cwe.mitre.org/data/definitions/23.html) + +* [CWE-36 Absolute Path Traversal](https://cwe.mitre.org/data/definitions/36.html) + +* [CWE-59 Improper Link Resolution Before File Access ('Link Following')](https://cwe.mitre.org/data/definitions/59.html) + +* [CWE-61 UNIX Symbolic Link (Symlink) Following](https://cwe.mitre.org/data/definitions/61.html) + +* [CWE-65 Windows Hard Link](https://cwe.mitre.org/data/definitions/65.html) + +* [CWE-200 Exposure of Sensitive Information to an Unauthorized Actor](https://cwe.mitre.org/data/definitions/200.html) + +* [CWE-201 Exposure of Sensitive Information Through Sent Data](https://cwe.mitre.org/data/definitions/201.html) + +* [CWE-219 Storage of File with Sensitive Data Under Web Root](https://cwe.mitre.org/data/definitions/219.html) + +* [CWE-276 Incorrect Default Permissions](https://cwe.mitre.org/data/definitions/276.html) + +* [CWE-281 Improper Preservation of Permissions](https://cwe.mitre.org/data/definitions/281.html) + +* [CWE-282 Improper Ownership Management](https://cwe.mitre.org/data/definitions/282.html) + +* [CWE-283 Unverified Ownership](https://cwe.mitre.org/data/definitions/283.html) + +* [CWE-284 Improper Access Control](https://cwe.mitre.org/data/definitions/284.html) + +* [CWE-285 Improper Authorization](https://cwe.mitre.org/data/definitions/285.html) + +* [CWE-352 Cross-Site Request Forgery (CSRF)](https://cwe.mitre.org/data/definitions/352.html) + +* [CWE-359 Exposure of Private Personal Information to an Unauthorized Actor](https://cwe.mitre.org/data/definitions/359.html) + +* [CWE-377 Insecure Temporary File](https://cwe.mitre.org/data/definitions/377.html) + +* [CWE-379 Creation of Temporary File in Directory with Insecure Permissions](https://cwe.mitre.org/data/definitions/379.html) + +* [CWE-402 Transmission of Private Resources into a New Sphere ('Resource Leak')](https://cwe.mitre.org/data/definitions/402.html) + +* [CWE-424 Improper Protection of Alternate Path](https://cwe.mitre.org/data/definitions/424.html) + +* [CWE-425 Direct Request ('Forced Browsing')](https://cwe.mitre.org/data/definitions/425.html) + +* [CWE-441 Unintended Proxy or Intermediary ('Confused Deputy')](https://cwe.mitre.org/data/definitions/441.html) + +* [CWE-497 Exposure of Sensitive System Information to an Unauthorized Control Sphere](https://cwe.mitre.org/data/definitions/497.html) + +* [CWE-538 Insertion of Sensitive Information into Externally-Accessible File or Directory](https://cwe.mitre.org/data/definitions/538.html) + +* [CWE-540 Inclusion of Sensitive Information in Source Code](https://cwe.mitre.org/data/definitions/540.html) + +* [CWE-548 Exposure of Information Through Directory Listing](https://cwe.mitre.org/data/definitions/548.html) + +* [CWE-552 Files or Directories Accessible to External Parties](https://cwe.mitre.org/data/definitions/552.html) + +* [CWE-566 Authorization Bypass Through User-Controlled SQL Primary Key](https://cwe.mitre.org/data/definitions/566.html) + +* [CWE-601 URL Redirection to Untrusted Site ('Open Redirect')](https://cwe.mitre.org/data/definitions/601.html) + +* [CWE-615 Inclusion of Sensitive Information in Source Code Comments](https://cwe.mitre.org/data/definitions/615.html) + +* [CWE-639 Authorization Bypass Through User-Controlled Key](https://cwe.mitre.org/data/definitions/639.html) + +* [CWE-668 Exposure of Resource to Wrong Sphere](https://cwe.mitre.org/data/definitions/668.html) + +* [CWE-732 Incorrect Permission Assignment for Critical Resource](https://cwe.mitre.org/data/definitions/732.html) + +* [CWE-749 Exposed Dangerous Method or Function](https://cwe.mitre.org/data/definitions/749.html) + +* [CWE-862 Missing Authorization](https://cwe.mitre.org/data/definitions/862.html) + +* [CWE-863 Incorrect Authorization](https://cwe.mitre.org/data/definitions/863.html) + +* [CWE-918 Server-Side Request Forgery (SSRF)](https://cwe.mitre.org/data/definitions/918.html) + +* [CWE-922 Insecure Storage of Sensitive Information](https://cwe.mitre.org/data/definitions/922.html) + +* [CWE-1275 Sensitive Cookie with Improper SameSite Attribute](https://cwe.mitre.org/data/definitions/1275.html) From be97e188ff51fe1f78f4a127c8faac3347ce640a Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 01:47:57 +0900 Subject: [PATCH 068/167] Translate A07:2025 Authentication Failures document to Korean --- .../ko/A07_2025-Authentication_Failures.md | 93 +++++++++---------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index 2d3077107..a000f8f38 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -1,33 +1,33 @@ -# A07:2025 Authentication Failures ![icon](../assets/TOP_10_Icons_Final_Identification_and_Authentication_Failures.png){: style="height:80px;width:80px" align="right"} +# A07:2025 인증 실패 ![icon](../assets/TOP_10_Icons_Final_Identification_and_Authentication_Failures.png){: style="height:80px;width:80px" align="right"} -## Background. +## 배경. -Authentication Failures maintains its position at #7 with a slight name change to more accurately reflect the 36 CWEs in this category. Despite benefits from standardized frameworks, this category has kept its #7 rank from 2021. Notable CWEs included are *CWE-259 Use of Hard-coded Password*, *CWE-297: Improper Validation of Certificate with Host Mismatch*, *CWE-287: Improper Authentication*, *CWE-384: Session Fixation*, and *CWE-798 Use of Hard-coded Credentials*. +인증 실패는 동일하게 7위를 유지하고 있으며, 해당 카테고리에 해당되는 36개의 CWE를 보다 정확하게 반영하기 위해 명칭을 약간 변경했다. 표준화된 프레임워크로부터의 이점에도 불구하고, 이 카테고리는 2021년부터 7위를 유지해 왔다. 대표적인 CWE로는 *CWE-259 하드코딩된 비밀번호 사용*, *CWE-297: 호스트 불일치 상황에서의 인증서 검증 미흡*, *CWE-287: 부적절한 인증*, *CWE-384: 세션 고정(Session Fixation)*, 그리고 *CWE-798 하드코딩된 자격 증명 사용*이 포함된다. -## Score table. +## 점수표. - - - - - - - - - @@ -54,77 +54,76 @@ Authentication Failures maintains its position at #7 with a slight name change t -## Description. +## 설명. -When an attacker is able to trick a system into recognizing an invalid or incorrect user as legitimate, this vulnerability is present. There may be authentication weaknesses if the application: +공격자가 시스템을 속여 유효하지 않거나 잘못된 사용자 정보를 정상 사용자로 인증되도록 만들 수 있는 경우, 해당 취약점이 존재한다고 판단한다. 특히 애플리케이션이 아래와 같은 행위를 실질적으로 방어하지 못하면 인증 관련 약점이 있을 수 있다. -* Permits automated attacks such as credential stuffing, where the attacker has a breached list of valid usernames and passwords. More recently this type of attack has been expanded to include hybrid password attacks credential stuffing (also known as password spray attacks), where the attacker uses variations or increments of spilled credentials to gain access, for instance trying Password1!, Password2!, Password3! and so on. +* 공격자가 유효한 사용자명과 비밀번호의 유출 목록을 보유한 상태에서 수행하는 크리덴셜 스터핑(credential stuffing)과 같은 자동화 공격을 방어하지 못하는 경우. 최근에는 이러한 유형의 공격이 하이브리드 비밀번호 공격(일명 비밀번호 스프레이 공격)까지로 확장되었는데, 이는 공격자가 유출된 자격 증명의 변형 또는 숫자를 더하는 방법을 사용하여 접근 권한을 획득하는 방식이다. 예를 들어 획득된 비밀번호가 Password1!인 경우 Password2!, Password3! 등을 순차적으로 시도하는 것이다. -* Permits brute force or other automated, scripted attacks that are not quickly blocked. +* 무차별 대입(brute force) 또는 기타 자동화된 스크립트 기반 공격을 방어하지 못하는 경우 혹은 이러한 공격이 신속하게 차단되지 않는 경우. -* Permits default, weak, or well-known passwords, such as "Password1" or "admin" username with an "admin" password. +* 기본 비밀번호, 취약한 비밀번호 또는 널리 알려진 비밀번호를 허용하는 경우. 예를 들어 "Password1"와 같은 비밀번호나 "admin" 사용자명과 "admin" 비밀번호와 같은 조합이 있다. -* Allows users to create new accounts with already known-breached credentials. +* 이미 유출된 아이디 및 비밀번호로 사용자가 새 계정을 생성할 수 있느 경우. -* Allows use of weak or ineffective credential recovery and forgot-password processes, such as "knowledge-based answers," which cannot be made safe. +* 안전하지 않은 "질문-답변 방식 비밀번호 찾기"과 같은 취약하거나 비효율적인 자격 증명 복구 및 비밀번호 찾기 프로세스를 사용하는 경우. -* Uses plain text, encrypted, or weakly hashed passwords data stores (see[ A04:2025-Cryptographic Failures](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/)). +* 평문, 암호화된, 또는 약한 해시(hash)로 해시된 비밀번호를 사용하는 경우. [A04:2025-Cryptographic Failures](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/) 참고. -* Has missing or ineffective multi-factor authentication. +* 다중 인증(MFA)이 이 누락되어 있거나 효과적이지 않은 경우. -* Allows use of weak or ineffective fallbacks if multi-factor authentication is not available. +* 다중 인증을 사용할 수 없을 때 적용되는 대체 수단(fallback)이 취약하거나 효과적이지 않은 경우. -* Exposes session identifier in the URL, a hidden field, or another insecure location that is accessible to the client. +* 세션 식별자가 URL, 히든 필드, 또는 클라이언트가 접근 가능한 기타 안전하지 않은 위치에 노출되는 경우. -* Reuses the same session identifier after successful login. +* 로그인 성공 후에도 동일한 세션 식별자를 재사용하는 경우. -* Does not correctly invalidate user sessions or authentication tokens (mainly single sign-on (SSO) tokens) during logout or a period of inactivity. +* 로그아웃 또는 비활성 기간 동안 사용자 세션 또는 인증 토큰(싱글 사인온[SSO] 토큰)을 올바르게 무효화하지 않는 경우. -* Does not correctly assert the scope and intended audience of the provided credentials. +* 제공된 자격 증명의 범위(scope) 및 의도된 대상(audience)을 올바르게 검증하지 않는 경우. -## How to prevent. +## 대응 방안. -* Where possible, implement and enforce use of multi-factor authentication to prevent automated credential stuffing, brute force, and stolen credential reuse attacks. +* 가능하다면 MFA를 도입하고 강제 적용하여 자동화된 크리덴셜 스터핑, 무차별 대입 공격 및 탈취된 자격 증명의 재사용 공격을 차단한다. -* Where possible, encourage and enable the use of password managers, to help users make better choices. +* 가능하다면 사용자가 더 나은 선택을 할 수 있도록 비밀번호 관리자의 사용을 장려하고 활성화한다. -* Do not ship or deploy with any default credentials, particularly for admin users. +* 배포 시점에 기본 계정 및 기본 비밀번호가 남아있지 않도록 하며, 특히 관리자 계정은 더 신경쓴다. -* Implement weak password checks, such as testing new or changed passwords against the top 10,000 worst passwords list. +* 신규 및 변경 비밀번호에 대해 최악의 비밀번호 Top 10,000에 기반하여 해당 비밀번호를 설정하지 못하도록 적용한다. -* During new account creation and password changes validate against lists of known breached credentials (eg: using [haveibeenpwned.com](https://haveibeenpwned.com)). +* 신규 계정 생성 및 비밀번호 변경 시, 알려진 유출 자격 증명 목록에 있는지 검증한다. (예: [haveibeenpwned.com](https://haveibeenpwned.com) 사용.) -* Align password length, complexity, and rotation policies with [National Institute of Standards and Technology (NIST) 800-63b's guidelines in section 5.1.1](https://pages.nist.gov/800-63-3/sp800-63b.html#:~:text=5.1.1%20Memorized%20Secrets) for Memorized Secrets or other modern, evidence-based password policies. +* 비밀번호 정책(길이, 복잡도, 주기적 변경)은 [NIST 800-63B 섹션 5.1.1](https://pages.nist.gov/800-63-3/sp800-63b.html#:~:text=5.1.1%20Memorized%20Secrets) 등 현대적 근거 기반 가이드에 맞춰 수립한다. -* Do not force human beings to rotate passwords unless you suspect breach. If you suspect breach, force password resets immediately. +* 유출이 의심되지 않는 한, 사람에게 비밀번호를 주기적으로 변경하도록 강제하지 않는다. 유출이 의심되는 경우, 즉시 비밀번호 재설정을 강제한다. -* Ensure registration, credential recovery, and API pathways are hardened against account enumeration attacks by using the same messages for all outcomes (“Invalid username or password.”). +* 계정 열거 공격에 계정 존재 여부가 드러나지 않도록 회원가입, 비밀번호 복구, API 응답 메시지를 결과와 무관하게 동일(예: "올바르지 않은 유저명 혹은 패스워드")하게 유지한다. -* Limit or increasingly delay failed login attempts but be careful not to create a denial of service scenario. Log all failures and alert administrators when credential stuffing, brute force, or other attacks are detected or suspected. +* 로그인 실패에 대해 횟수 제한 또는 점진적인 지연을 적용하되, 과도한 통제로 DoS(denial of service)가 유발되지 않도록 설계한다. 또한 실패 이벤트를 로깅하고 크리덴셜 스터핑이나 무차별 대입 공격 징후 탐지 시 관리자에게 알림을 발송한다. -* Use a server-side, secure, built-in session manager that generates a new random session ID with high entropy after login. Session identifiers should not be in the URL, be securely stored in a secure cookie, and invalidated after logout, idle, and absolute timeouts. +* 세션은 높은 엔트로피를 가진 새로운 무작위 세션 ID를 생성하는 서버 측의 안전한 내장 세션 관리자를 사용한다. 세션 식별자는 URL에 포함되지 않아야 하며, 쿠키에 안전하게 저장되고, 로그아웃, 유휴 시간이 지나거나 및 최대 세션 시간 이후 무효가 되어야 한다. -* Ideally, use a premade, well-trusted system to handle authentication, identity, and session management. Transfer this risk whenever possible by buying and utilizing a hardened and well tested system. +* 가능하면 인증, 아이덴티티, 세션 관리를 자체 구현하기보다 사전 제작된, 신뢰할 수 있는 시스템을 사용한다. 가능하다면 검증되고 충분히 테스트 된 도구를 구매/활용해 구현 위험을 줄인다. -* Verify the intended use of provided credentials, e.g. for JWTs validate `aud`, `iss` claims and scopes +* 제공된 자격 증명의 어디에 무엇을 위해 사용되는지 검증한다. 예를 들어 JWT의 경우 `aud`와 `iss` 클레임(claim) 및 스코프(scope)를 검증한다. +## 공격 시나리오 예시. -## Example attack scenarios. +**시나리오 1:** 크리덴셜 스터핑은 유출된 계정-비밀번호 조합을 자동으로 대입하는 대표적인 공격이다. 최근에는 사람들의 습관을 악용해 비밀번호의 숫자를 증가 및 감소시켜 가며 공격하는 사례가 확인되고 있다. 예를 들어, 예를 들어 'Winter2025'를 'Winter2026'으로 바꾸거나, 'ILoveMyDog6'를 'ILoveMyDog7' 또는 'ILoveMyDog5'로 바꾸는 식이다. 이러한 공격을 하이브리드 크리덴셜 스터핑 공격 또는 패스워드 스프레이 공격이라고 하며, 기존의 크리덴셜 스터핑보다 더 효과적일 수 있다. 애플리케이션이 자동화된 위협(무차별 대입, 스크립트, 봇) 또는 크리덴셜 스터핑에 대한 방어를 구현하지 않으면, 해당 애플리케이션은 자격 증명이 유효한지 여부를 판별하는 패스워드 오라클로 악용되어 비인가 접근을 획득하는 데 사용될 수 있다. -**Scenario #1:** Credential stuffing, the use of lists of known username and password combinations, is now a very common attack. More recently attackers have been found to ‘increment’ or otherwise adjust passwords, based on common human behavior. For instance, changing ‘Winter2025’ to ‘Winter2026’, or ‘ILoveMyDog6’ to ‘ILoveMyDog7’ or ‘ILoveMyDog5’. This adjusting of password attempts is called a hybrid credential stuffing attack or a password spray attack, and they can be even more effective than the traditional version. If an application does not implement defences against automated threats (brute force, scripts, or bots) or credential stuffing, the application can be used as a password oracle to determine if the credentials are valid and gain unauthorized access. +**시나리오 2:** 인증 공격의 상당수는 비밀번호만으로 인증을 구성하는 구조에서 발생한다. 과거에 권장되던 주기적 비밀번호 변경 및 과도한 복잡도 정책은 오히려 비밀번호 재사용을 늘리고 기억하기 쉬운 취약 패턴을 만들 수 있다. 따라서 NIST 800-63의 권고에 맞춰 불필요한 정책을 지양하고, 중요 시스템에는 다중 인증(MFA)을 기본으로 강제 적용하는 것이 바람직하다.es per NIST 800-63 and to enforce use of multi-factor authentication on all important systems. -**Scenario #2:** Most successful authentication attacks occur due to the continued use of passwords as the sole authentication factor. Once considered best practices, password rotation and complexity requirements encourage users to both reuse passwords and use weak passwords. Organizations are recommended to stop these practices per NIST 800-63 and to enforce use of multi-factor authentication on all important systems. +**시나리오 3:** 애플리케이션의 세션 타임아웃이 올바르게 구현되지 않았다. 사용자가 공용 컴퓨터에서 애플리케이션에 접근한 뒤 "로그아웃" 버튼 대신에 대신 브라우저 탭을 닫고 자리를 떠난다. 또 다른 예로, 로그아웃으로 SSO(Single Sign on) 세션을 종료할 수 없는 경우가 있다. 즉, SSO로 메일, 문서 시스템, 채팅 시스템에 로그인되지만, 로그아웃은 사용하는 시스템만 로그아웃된다. 성공적으로 로그아웃했다고 생각한 브라우저를 사용하되 일부 애플리케이션에서 사용자가 여전히 인증된 상태라면, 피해자 계정에 접근할 수 있다. 이 상태에서 공격자가 같은 브라우저를 사용하면, 다른 애플리케이션에는 세션이 남아 있어 피해자 계정에 접근이 가능해진다. 동일한 문제는 민감한 애플리케이션이 적절히 종료되지 않은 상태에서 동료가 잠금 해제된 컴퓨터에 (일시적으로) 접근할 수 있는 사무실/기업 환경에서도 발생할 수 있다. -**Scenario #3:** Application session timeouts aren't implemented correctly. A user uses a public computer to access an application and instead of selecting "logout," the user simply closes the browser tab and walks away. Another Example for this is, if a Single Sign on (SSO) session can not be closed by a Single Logout (SLO). That is, a single login logs you into, for example, your mail reader, your document system, and your chat system. But logging out happens only to the current system. If an attacker uses the same browser after the victim thinks they have successfully logged out, but with the user still authenticated to some of the applications, then can access the victim's account. The same issue can happen in offices and enterprises when a sensitive application has not been properly exited and a colleague has (temporary) access to the unlocked computer. - -## References. +## 참조. * [OWASP Authentication Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html) * [OWASP Secure Coding Practices](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/stable-en/01-introduction/05-introduction) -## List of Mapped CWEs +## 해당되는 CWE 목록. * [CWE-258 Empty Password in Configuration File](https://cwe.mitre.org/data/definitions/258.html) From 1c9bd99e92329e1698643e78f6dac76ba5dc0b97 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Sun, 4 Jan 2026 16:06:37 +0900 Subject: [PATCH 069/167] Create A04:2025 Cryptographic Failures documentation Added a comprehensive document on cryptographic failures, detailing background, scoring, explanations, countermeasures, attack scenarios, and references related to cryptography in applications. --- .../ko/A04_2025-Cryptographic_Failures.md | 198 ++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 2025/docs/ko/A04_2025-Cryptographic_Failures.md diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md new file mode 100644 index 000000000..7c76bacba --- /dev/null +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -0,0 +1,198 @@ +# A04:2025 암호학적 실패 ![icon](../assets/TOP_10_Icons_Final_Crypto_Failures.png){: style="height:80px;width:80px" align="right"} + + + +## 배경. + +2단계 하락해 4위에 유지하고 있다. 이번 카테고리는 암호화 부재, 불충분하게 강한 암호화, 약한 암호화키 그리고 에러와 관련된 실패에 중점을 둔다. 해당 카테고리에 포함된 3개의 CWE는 약한 의사 난수 생성기(PRNG)와 관련되어 있다. `CWE-327: 위험하고 실패한 암호화 알고리즘`, `CWE-331: 불충분한 엔트로피`, `CWE-1241: 난수 생성기 내 예측 가능한 알고리즘`, `CWE-338: 암호학적 약한 의사난수 생성기(PRNG) 사용` + + + +## 점수표. + + +
CWEs Mapped + 해당되는 CWE 개수 Max Incidence Rate + 최대 취약점 발생률 Avg Incidence Rate + 평균 취약점 발생률 Max Coverage + 최대 테스트 커버리지 Avg Coverage + 평균 테스트 커버리지 Avg Weighted Exploit + 평균 가중 악용도 Avg Weighted Impact + 평균 가중 영향도 Total Occurrences + 총 발생 건수 Total CVEs + 총 CVE 건수
+ + + + + + + + + + + + + + + + + + + + + + +
해당되는 CWE 개수 + 최대 취약점 발생률 + 평균 취약점 발생률 + 최대 테스트 커버리지 + 평균 테스트 커버리지 + 가중 평균 악용도 + 가중 평균 영향도 + 총 발생 건수 + 총 CVE 건수 +
32 + 13.77% + 3.80% + 100.00% + 47.74% + 7.23 + 3.90 + 1,665,348 + 2,185 +
+ + + +## 설명. + +흔히 말하기를, [전송 계층]((https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 내 모든 데이터는 암호화되어 전송되어야 한다고 한다. 이전 장벽으로 CPU 성능, 프라이빗 키/인증서 관리가 있었으나, 지금은 CPU 명령어 셋이 정확한 암호화를(예시: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 위해 설계되었고, 프라이빗 키와 인정서 관리는 [LetsEncrypt.org](https://LetsEncrypt.org) 같은 서비스나 큰 클라우드 벤더들이 특정 플랫폼을 위한 통합된 인증서 관리 서비스를 제공하여 관리하기 쉬워졌다. + +전송 계층 보안 외에도 어떤 저장된 데이터에 암호화가 필요한지 결정하는 것과 전송 중 ([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer) 내, OSI 7계층)에도 추가적인 암호화가 필요한지 결정하는 것도 중요하다. 예시로, 패스워드, 신용 카드 번호, 건강 정보, 개인 정보 그리고 비즈니스 기밀 자료는 추가적 보호가 요구된다. 특히 해당 데이터가 개인정보 법률 (예시, GDPR, PCI DSS)에 명시된 경우 더욱 그렇다. +해당 데이터들을 위해선 다음과 같은 사항들이 해당되는지 검토하여야 한다. + + + +* 약하거나 오래된 암호화 알고리즘이나 프로토콜이 기본 값으로 또는 예전 코드에 사용되는가? +* 기본 암호키가 사용되는가, 약한 암호키가 생성되었는가, 같은 키가 반복적으로 사용되는가, 적절한 키 관리 시스템이나 키 변경 주기가 있는가? +* 사용되는 암호키가 소스코드 저장소 내 존재하는가? +* 암호화가 강제되는가? (예시. HTTP 헤더 보안 지시자 또는 헤더 존재 여부) +* 수신한 서버 인증서와 신뢰 체인이 적절히 검증되었는가? +* 초기 벡터가 무시되거나, 재사용되거나 또는 운영 암호화 모드를 위한 충분한 초기 벡터가 생성되었는가? ECB 같은 안전하지 않은 운영 모드를 사용하는가? 인증된 적절한 암호화가 존재하는데 단순한 암호화를 사용하지는 않는가? +* 패스워드 기반 키 유도 함수가 없는 상태에서 패스워드가 암호키로써 사용되는가? +* 암호화 요구사항에 충족하지 않는 난수를 사용하는가? 만약 올바른 함수를 선택하더라도 개발자가 시드를 선택해야 하는가? 만일 아니라면, 개발자가 충분한 엔트로피/예측 불가능성이 부족한 시드로 강한 시드 기능을 덮어쓰지는 않았는가? +* MD5, SHA1 같은 더 이상 사용하지 않는 해시 함수를 사용하고 있거나 또는 암호학적 해시 함수가 필요할 때 비암호학적 해시 함수를 사용하는가? +* 암호화 알고리즘이 다운 그레이드 되거나 우회 가능한가? + +레퍼런스 참고 ASVS: Cryptography (V11), Secure Communication (V12) and Data Protection (V14). + + +## 대응 방안. + +최소한 다음 사항들을 수행하고 레퍼런스를 참고하라. + + + +* 애플리케이션에 의해 진행, 저장, 전송되는 데이터를 분류, 라벨링한다. 개인정보 보호법, 규제 요구사항, 비즈니스 필요에 따른 어떤 데이터가 민감한지 식별한다. +* 하드웨어 또는 클라우드 기반 HSM(하드웨어 보안 모듈)에 민감한 키를 보관한다. +* 언제나 사용 가능한 신뢰할 수 있는 암호화 알고리즘을 이용한다. +* 불필요한 민감 데이터는 저장하지 않는다. 저장할 시 가능한 빠르게 지우거나 PCI DSS 준수 토큰화(PCI DSS compliant tokenization) 이용 또는 마스킹 처리를 한다. 데이터가 보관되지 않으면 훔쳐질 수 없다. +* 모든 민감 데이터 암호화 되었는지 확인하라. +* 강한 표준 알고리즘, 프로토콜, 키가 최신 인지 확인하고 적절한 키 관리 시스템을 이용해라. +* 모든 데이터는 전달 시 전방향 보안(Forward secrecy), 암호 블록 체인(Cipher block chaining)에 대한 지원을 중단하고, 퀀텀 키 변경 알고리즘을 지원하는 TLS 1.2 버전 이상에서 암호화 되어야 한다. HTTP 스트릭 전송 보안(HTTP Strict Transport Security, HSTS) 을 이용해 HTTPS 강제 암호화를 하여야 한다. 모든 것을 도구를 이용해 검사하라. +* 민감 데이터가 들어있는 응답 값 캐싱을 비활성화한다. 이는 콘텐츠 전송 네트워크(CDN), 웹 서버 내 캐싱과 모든 애플리케이션 캐싱을 포함한다. (예시. 레디스(Redis)) +* 매번의 데이터 분류 작업에서 요구된 보안 통제를 적용하라. +* FTP 나 STARTTLS 같은 암호화되지 않은 프로토콜을 사용하지 마라. 기밀 정보 전달에 SMTP 사용을 피해라. +* 아라곤2(Argon2), 예스크립트(yescrypt, 스크립트(scrypt) 또는 PBKDF2-HMAC-SHA-512 같은 작업 인자(지연 인자라고도 함)과 강한 적응력(Adaptive)이 강구된 솔트 해싱 함수를 사용하라. 레거시 시스템을 위해 비크립트(bcrypt) 이용 시 [OWASP Cheat Sheet: Password Storage](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) 을 참고하라. + \* 적응력: 시간이 갈 수록 레인보우 테이블 생성에 많은 리소스가 사용되게 하는 능력 + \* 작업 인자: 계산 횟수를 증가시키는 것과 같이 해시 과정을 복잡하게 만드는 인자 +* ////쑤쩡 초기화 벡터(IV)는 운영 모드에 따라 적절하게 선택되어야 하며, 이는 암호화적 보안 의사난수 생성기(cryptographically secure pseudo random number generator, CSPRNG) 사용을 의미할 수 있다. 해당 모드는 넌스값을 요구하며, 초기화 벡터는 CSPRNG가 필요하지 않다. 모든 케이스에서 초기화 벡터는 수정된 키에서 두번 이상 사용되지 않았다./// +* 일반 암호화보단 인증된 암호화를 사용해라. +* 키는 암호학적으로 랜덤하게 생성되며, 메모리 내 바이트 배열로써 저장되어야 한다. 만약 패스워드가 사용 중이라면, 이는 적절한 패스워드 기반 키 유도 함수를 통한 키로 변환된 상태여야 한다. +* 적절한 곳에서 암호학적 무작위성이 사용되는지와 낮은 엔트로피나 예측 가능한 시드가 사용되지 않는지 확인해라. 대다수의 현대 API는 개발자에게 CSPRNG에 보안을 설정할 것을 요구하지 않는다. +* MD5, SHA1, 암호 블록 체이닝 모드(CBC), PKCS number 1 v1.5. 같은 사용되지 않는 암호학 함수, 블록 빌딩 메소드, 패딩 스키마 사용을 피해라. +* 리뷰, 보안 전문가, 사용할 도구의 목적사항을 통해 설정 값이 보안 요구사항에 맞는지 확인해라. +* 양자 컴퓨터 이후의 암호학(PQC)을 준비해야 하며, 고위험 시스템은 2030년 전까지 반드시 안전하게 보호되도록 하여야 한다.(ENISA 참고) + + +## 공격 시나리오 예시. + +**시나리오 1**: A 사이트는 모든 페이지에 TLS 강제을사용하지 않거나 약한 암호화 알고리즘을 지원한다. 공격자는 네트워크 트래픽을 모니터링해 가로챈 요청에서 HTTPS에서 HTTP로 다운그레이드하여 사용자의 세션 쿠키를 가로챌 수 있다. 공격자는 세션 쿠키를 재전송해 사용자 세션을 하이재킹하여 사용자 개인 정보 접근 또는 변조가 가능하다. 위 내용 말고도 공격자는 전송되는 모든 데이터 변조가 가능하다. (예: 송금 수신자) + +**시나리오 2**: 데이터베이스 내 패스워드는 솔트가 포함되지 않는 단순 해시로 모든 사용자의 패스워드를 저장한다. 파알 업로드 취약점으로 사용자 패스워드 해시값 탈취가 가능하고, 솔트가 포함되지 않는 해시는 사전 계산된 레인보우 테이블로 매핑하여 원본 패스워드 탈취가 가능하다. 간단하고 빠른 해시 함수로 생성한 해시는 GPU로 크랙 가능하며, 이는 솔트가 포함된 패스워드 또한 마찬가지다. +\* 솔트가 포함된 패스워드라 하더라도 공격자가 보유 중인 패스워드 사전 목록 또는 브루트 포싱을 이용해 레인보우 테이블을 생성해 패스워드 매핑 작업이 가능하다. 이를 방지하기 위해 대소문자, 특수문자, 숫자가 포함되고 사용자 인적사항과 관련없는 13자리 이상의 패스워드 사용을 권장하는 것이다. + + +## 참조. + + + +* [OWASP Proactive Controls: C2: Use Cryptography to Protect Data ](https://top10proactive.owasp.org/archive/2024/the-top-10/c2-crypto/) +* [OWASP Application Security Verification Standard (ASVS): ](https://owasp.org/www-project-application-security-verification-standard) [V11,](https://github.com/OWASP/ASVS/blob/v5.0.0/5.0/en/0x20-V11-Cryptography.md) [12, ](https://github.com/OWASP/ASVS/blob/v5.0.0/5.0/en/0x21-V12-Secure-Communication.md) [14](https://github.com/OWASP/ASVS/blob/v5.0.0/5.0/en/0x23-V14-Data-Protection.md) +* [OWASP Cheat Sheet: Transport Layer Protection](https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html) +* [OWASP Cheat Sheet: User Privacy Protection](https://cheatsheetseries.owasp.org/cheatsheets/User_Privacy_Protection_Cheat_Sheet.html) +* [OWASP Cheat Sheet: Password Storage](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) +* [OWASP Cheat Sheet: Cryptographic Storage](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html) +* [OWASP Cheat Sheet: HSTS](https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Strict_Transport_Security_Cheat_Sheet.html) +* [OWASP Testing Guide: Testing for weak cryptography](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/README) +* [ENISA: A Coordinated Implementation Roadmap for the Transition to Post-Quantum Cryptography](https://digital-strategy.ec.europa.eu/en/library/coordinated-implementation-roadmap-transition-post-quantum-cryptography) +* [NIST Releases First 3 Finalized Post-Quantum Encryption Standards](https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards) + + +## List of Mapped CWEs + +* [CWE-261 Weak Encoding for Password](https://cwe.mitre.org/data/definitions/261.html) + +* [CWE-296 Improper Following of a Certificate's Chain of Trust](https://cwe.mitre.org/data/definitions/296.html) + +* [CWE-319 Cleartext Transmission of Sensitive Information](https://cwe.mitre.org/data/definitions/319.html) + +* [CWE-320 Key Management Errors (Prohibited)](https://cwe.mitre.org/data/definitions/320.html) + +* [CWE-321 Use of Hard-coded Cryptographic Key](https://cwe.mitre.org/data/definitions/321.html) + +* [CWE-322 Key Exchange without Entity Authentication](https://cwe.mitre.org/data/definitions/322.html) + +* [CWE-323 Reusing a Nonce, Key Pair in Encryption](https://cwe.mitre.org/data/definitions/323.html) + +* [CWE-324 Use of a Key Past its Expiration Date](https://cwe.mitre.org/data/definitions/324.html) + +* [CWE-325 Missing Required Cryptographic Step](https://cwe.mitre.org/data/definitions/325.html) + +* [CWE-326 Inadequate Encryption Strength](https://cwe.mitre.org/data/definitions/326.html) + +* [CWE-327 Use of a Broken or Risky Cryptographic Algorithm](https://cwe.mitre.org/data/definitions/327.html) + +* [CWE-328 Reversible One-Way Hash](https://cwe.mitre.org/data/definitions/328.html) + +* [CWE-329 Not Using a Random IV with CBC Mode](https://cwe.mitre.org/data/definitions/329.html) + +* [CWE-330 Use of Insufficiently Random Values](https://cwe.mitre.org/data/definitions/330.html) + +* [CWE-331 Insufficient Entropy](https://cwe.mitre.org/data/definitions/331.html) + +* [CWE-332 Insufficient Entropy in PRNG](https://cwe.mitre.org/data/definitions/332.html) + +* [CWE-334 Small Space of Random Values](https://cwe.mitre.org/data/definitions/334.html) + +* [CWE-335 Incorrect Usage of Seeds in Pseudo-Random Number Generator(PRNG)](https://cwe.mitre.org/data/definitions/335.html) + +* [CWE-336 Same Seed in Pseudo-Random Number Generator (PRNG)](https://cwe.mitre.org/data/definitions/336.html) + +* [CWE-337 Predictable Seed in Pseudo-Random Number Generator (PRNG)](https://cwe.mitre.org/data/definitions/337.html) + +* [CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator(PRNG)](https://cwe.mitre.org/data/definitions/338.html) + +* [CWE-340 Generation of Predictable Numbers or Identifiers](https://cwe.mitre.org/data/definitions/340.html) + +* [CWE-342 Predictable Exact Value from Previous Values](https://cwe.mitre.org/data/definitions/342.html) + +* [CWE-347 Improper Verification of Cryptographic Signature](https://cwe.mitre.org/data/definitions/347.html) + +* [CWE-523 Unprotected Transport of Credentials](https://cwe.mitre.org/data/definitions/523.html) + +* [CWE-757 Selection of Less-Secure Algorithm During Negotiation('Algorithm Downgrade')](https://cwe.mitre.org/data/definitions/757.html) + +* [CWE-759 Use of a One-Way Hash without a Salt](https://cwe.mitre.org/data/definitions/759.html) + +* [CWE-760 Use of a One-Way Hash with a Predictable Salt](https://cwe.mitre.org/data/definitions/760.html) + +* [CWE-780 Use of RSA Algorithm without OAEP](https://cwe.mitre.org/data/definitions/780.html) + +* [CWE-916 Use of Password Hash With Insufficient Computational Effort](https://cwe.mitre.org/data/definitions/916.html) + +* [CWE-1240 Use of a Cryptographic Primitive with a Risky Implementation](https://cwe.mitre.org/data/definitions/1240.html) + +* [CWE-1241 Use of Predictable Algorithm in Random Number Generator](https://cwe.mitre.org/data/definitions/1241.html) From 791a4276c1ebcea4dc4cb44fdc2e087faf8691d6 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 17:31:30 +0900 Subject: [PATCH 070/167] Reflect review feedback --- ...g_a_Modern_Application_Security_Program.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 0966934fc..74c122070 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -1,25 +1,26 @@ # 현대적 애플리케이션 보안 체계 수립 -OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 항목에서 다루는 중요한 위험의 인식을 높이기 위함이다. 이는 모든 위험을 망라한 목록이 아니라, 대응을 시작하기 위한 출발점으로 활용하도록 구성되어 있다. 따라서, 이전 버전에서부터 각 항목에 해당하는 위험을 예방하고 더 나아가 전반적인 보안 수준을 높이기 위한 최선의 방법으로 애플리케이션 보안 체계를 시작하는 것을 권고해왔다. 이 페이지에서는 현대적 애플리케이션 보안 체계를 수립을 어떻게 시작하고 구축하는지 다룰 것이다. +OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 항목에서 다루는 중요한 위험의 인식을 높이기 위함이다. 이는 모든 위험을 빠짐없이 다룬 목록이 아니라, 대응을 시작하기 위한 출발점으로 활용하도록 구성되어 있다. 따라서, 이전 버전에서부터 각 항목에 해당하는 위험을 예방하고 더 나아가 전반적인 보안 수준을 높이기 위한 최선의 방법으로 애플리케이션 보안 체계를 시작하는 것을 권고해왔다. 이 페이지에서는 현대적 애플리케이션 보안 체계 수립 시작을 어떻게 하고, 구축하는지 다룬다. -이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려하라. 해당 모델들은 포괄적이며 세부 항목까지 망라하고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야만 보안을 제대로 하고 있다고 볼 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. +이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려하라. 해당 모델들은 포괄적이며 세부 항목까지 빠짐없이 다루고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야 좋은 보안 체계라고 할 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. -애플리케이션 보안 체계를 처음 구축하는 단계이거나, 현재 팀의 상황에서 OWASP SAMM 및 DSOMM가 과도하다고 느껴진다면, 아래 내용을 참고하라. +애플리케이션 보안 체계를 처음 구축하는 단계이거나, 현재 팀의 상황에서 OWASP SAMM 또는 DSOMM가 과도하다고 느껴진다면, 아래 내용을 참고하라. ### 1. 위험 기반 포트폴리오 관리 체계 수립 -* 비즈니스 관점에서 가지고 있는 애플리케이션의 포트폴리오에서 보안 요구사항을 식별한다. 이때 보호하고자 하는 데이터 자산에 적용되는 개인정보보호 법령 및 관련 규제 기준으로 요구사항을 도출한다. +* 비즈니스 관점에서 가지고 있는 애플리케이션의 포트폴리오에서 보안 요구사항을 식별한다. 이때 보호하고자 하는 데이터 자산에 적용되는 개인정보보호 법령 및 관련 규제를 주요 기준으로 삼아 요구사항을 도출한다. * 조직의 위험 수용 수준에 맞춰, 가능성과 영향도 기준을 표준화한 [통합 위험 평가 모델](https://owasp.org/www-community/OWASP_Risk_Rating_Methodology)을 수립한다. * 위의 정의된 모델에 따라 전체 애플리케이션 및 API의 위험을 평가하고 우선순위를 결정한 뒤, 결과를 구성 관리 데이터베이스(Configuration Management Database, CMDB)에 등록한다. * 적용 범위와 요구되는 엄격도 수준을 정의하기 위한 가이드라인을 수립한다. +* Establish assurance guidelines to properly define coverage and level of rigor required. ### 2. 탄탄한 기반을 통한 실행 체계 확보 @@ -28,7 +29,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 수립한 정책 및 표준을 따를 수 있도록 재사용 가능한 공통 보안 통제를 정의하고 설계 및 개발 지침을 함께 제공한다. -* 개발자의 역할과 주제에 맞춘 애플리케이션 보안 교육 체계를 마련한다. +* 개발자의 역할과 주제에 맞춘 필수 애플리케이션 보안 교육 체계를 마련한다. ### 3. 기존 프로세스에 보안 내재화 @@ -41,23 +42,23 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 현행 시스템 개발 수명 주기(system development life cycle)와 모든 소프트웨어 보안 활동, 도구, 정책, 프로세스를 검토한 후 이를 문서화한다. -* 새로운 소프트웨어 개발 시에는 시스템 개발 생명주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서 수행 가능한 다양한 활동을 제시한다. 제시된 활동을 수행하여 모든 새로운 프로젝트 또는 소프트웨어에 조직의 요구 사항에 부합하는 보안 수준이 제공되도록 한다. +* 새로운 소프트웨어 개발 시에는 시스템 개발 수명 주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서 수행 가능한 다양한 활동을 제시한다. 제시된 활동을 수행하여 모든 새로운 프로젝트 또는 소프트웨어에 조직의 요구 사항에 부합하는 보안 수준이 제공되도록 한다. * 최종 산출물이 조직의 수용 가능한 위험 수준을 만족하도록 활동을 선정한다. -* 기존(때로는 레거시라고 함)의 소프트웨어의 경우 유지관리 계획을 수립한다. 안전한 애플리케이션을 유지하는 방법은 아래의 '운영 및 변경 관리' 섹션을 참고한다. +* 기존(때로는 레거시라고 함)의 소프트웨어의 경우 체계적인 유지관리 계획을 수립한다. 안전한 애플리케이션을 유지하는 방법은 아래의 '운영 및 변경 관리' 섹션을 참고한다. ### 4. 애플리케이션 보안 교육 -* 개발 조직의 보안 역량 강화를 위해 보안 챔피언(Security Champion) 제도 또는 개발자 대상 보안 교육 프로그램(보안 인식 프로그램이라고 부르기도 함)을 도입하는 방안을 검토한다. 이를 통해 개발자에게 필요한 지식을 교육할 수 있다. 이를 통해 개발자가 최신 보안 지식을 지속적으로 습득하고, 업무를 수행할 때 안전해질 수 있도록 지원하며, 보안 문화를 더욱 긍정적으로 만든다. 이는, 보안팀과의 신뢰를 향상하고 더 만족스러운 협업 관계를 형성할 수 있다. 관련 가이드는 [OWASP 보안 챔피언 가이드](https://securitychampions.owasp.org/)를 참고하며, 해당 가이드는 단계적으로 보강되고 있다. +* 개발 조직의 보안 역량 강화를 위해 보안 챔피언(Security Champion) 제도 또는 개발자 대상 보안 교육 프로그램(보안 인식 프로그램이라고 부르기도 함)을 도입하는 방안을 검토한다. 이를 통해 개발자에게 필요한 지식을 교육할 수 있다. 최신 보안 지식을 지속적으로 습득하고, 업무를 안전하게 수행할 수 있도록 지원하며, 보안 문화를 더욱 긍정적으로 만든다. 또한, 보안팀과의 신뢰를 높이고 더 만족스러운 협업 관계를 형성할 수 있다. 관련 가이드는 [OWASP 보안 챔피언 가이드](https://securitychampions.owasp.org/)를 참고하며, 해당 가이드는 단계적으로 보강되고 있다. * OWASP 교육 프로젝트는 개발자에게 웹 애플리케이션 보안을 교육하는 데 필요한 교육 자료를 제공한다. 취약점에 대한 실습 중심 학습을 위해 [OWASP Juice Shop 프로젝트](https://owasp.org/www-project-juice-shop/) 또는 [OWASP WebGoat](https://owasp.org/www-project-webgoat/)를 활용한다. 최신 동향을 유지하기 위해 [OWASP AppSec 컨퍼런스](https://owasp.org/events/), [OWASP 컨퍼런스 트레이닝](https://owasp.org/events/), 또는 지역 [OWASP Chapter](https://owasp.org/chapters/) 모임에 참여한다. -### 5. 지표 가시성 확보 +### 5. 운영 가시성 확보 -* 지표를 기반으로 관리하라. 수집된 지표 및 분석 데이터를 기반으로 개선 활동과 예산 의사결정을 추진한다. 지표로는 보안 활동 준수, 신규 취약점 유입, 취약점 조치, 테스트된 애플리케이션 범위, 결함 유형별 밀도 및 발생 건수 등이 있다. +* 지표를 기반으로 관리하라. 수집된 지표 및 분석 데이터를 기반으로 개선 활동과 예산 의사결정을 추진한다. 지표로는 보안 관행 및 활동 준수, 신규 취약점 유입, 취약점 조치, 테스트된 애플리케이션 범위, 결함 유형별 밀도 및 발생 건수 등이 있다. * 구현 및 검증 활동에서 축적된 데이터를 분석하여, 근본 원인(root cause)과 취약점 패턴을 식별하고, 전사 차원의 전략 및 시스템적 개선을 추진한다. 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공한다. @@ -74,19 +75,18 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 프로젝트 일정에 보안 활동을 명시적으로 편성한다. -* 프로젝트 킥오프에서 보안 담당을 지정하여, 관련자가 누구와 소통해야 하는지 알 수 있도록 한다. +* 프로젝트 킥오프에서 프로젝트의 보안 담당을 소개하여, 관련자가 누구와 소통해야 하는지 알 수 있도록 한다. -### 제안요청서(RFP) 및 합의 단계 +### 제안요청서(RFP) 및 계약 단계 -* 내외부 개발자와 요구사항을 사전에 합의하며, 조직의 보안 체계(예: SDLC 적용, 보안 모범사례 준수)에 부합하는 가이드라인과 및 보안 요구사항을 포함한다. -* Negotiate the requirements with internal or external developers, including guidelines and security requirements with respect to your security program, e.g. SDLC, best practices. +* 내외부 개발자와 요구사항을 사전에 합의하며, 조직의 보안 체계(예: SDLC 적용, 보안 모범사례 준수)에 부합하는 가이드라인 및 보안 요구사항을 포함한다. * 기획 및 설계 단계를 포함하여, 모든 기술 요구사항의 충족 여부를 평가한다. * 설계, 보안, 서비스 수준 계약(service level agreements, SLA)을 포함하여 모든 기술 요구사항을 협의한다. * [OWASP 보안 소프트웨어 계약 부록](https://owasp.org/www-community/OWASP_Secure_Software_Contract_Annex)와 같은 템플릿 및 체크리스트를 적용한다. -
**참고:** *해당 문서는 미국 계약법을 전제로 하므로, 해당 문서를 사용하기 전에 자격을 갖춘자에 의해 법률 자문을 구한다.* +
**참고:** *해당 문서는 미국 계약법을 전제로 하므로, 해당 문서를 사용하기 전에 자격을 갖춘 법률 전문가의 자문을 구한다.* ### 기획 및 설계 단계 @@ -106,9 +106,9 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 기존 사용자 스토리(user story)에 보안 사용자 스토리를 추가한다. -### 안전한 개발 생명주기(Secure Development Lifecycle) +### 안전한 개발 수명 주기(Secure Development Lifecycle) -* 조직이 애플리케이션 및 API를 구축할 때 따르는 프로세스를 개선하기 위해, [OWASP 소프트웨어 보증 성숙도 모델(SAMM)](https://owasp.org/www-project-samm/)을 권장한다. 이 모델은 조직이 직면한 특정 위험에 맞춘 소프트웨어 보안 전략을 수립하고 구현하는 데 도움이 됩니다. +* 조직이 애플리케이션 및 API를 구축할 때 따르는 프로세스를 개선하기 위해, [OWASP 소프트웨어 보증 성숙도 모델(SAMM)](https://owasp.org/www-project-samm/)을 권장한다. 이 모델은 조직이 직면한 특정 위험에 맞춘 소프트웨어 보안 전략을 수립하고 구현하는 데 도움이 된다. * 소프트웨어 개발자에게 시큐어 코딩 교육을 제공하고, 보다 견고하고 안전한 애플리케이션을 만들도록 지원하는 데 도움이 된다고 판단되는 기타 교육도 제공한다. @@ -118,7 +118,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 개발자가 보안상 안전한 선택을 기본으로 하도록, 가드레일을 적용한다. -* 강력하면서도 사용 가능한 보안 통제를 구축하는 것은 어렵다. 가능한 경우 안전한 기본값을 제공하고, 가능한 경우 '포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것)'를 만든다. [OWASP 치트 시트](https://cheatsheetseries.owasp.org/index.html)는 개발자에게 좋은 출발점이며, 많은 현대적 프레임워크는 인가(authorization), 검증(validation), 교차 사이트 요청 위조(CSRF) 방지 등과 관련한 표준적이고 효과적인 보안 통제를 제공한다. +* 강력하면서도 사용 가능한 보안 통제를 구축하는 것은 어렵다. 가능한 경우 안전한 기본값을 제공하고, 가능한 경우 '포장된 도로(paved roads, 가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것)'를 만든다. [OWASP 치트 시트](https://cheatsheetseries.owasp.org/index.html)는 개발자에게 좋은 출발점이며, 많은 현대적 프레임워크는 인가(authorization), 검증(validation), 교차 사이트 요청 위조(CSRF) 방지 등과 관련한 표준적이고 효과적인 보안 통제를 제공한다. * 개발자에게 보안 관련 IDE 플러그인을 제공하고 사용을 권장한다. @@ -128,11 +128,11 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 ### 지속적 애플리케이션 보안 테스트 체계 구축 -* 애플리케이션의 기술적 기능과 IT 아키텍처와의 연동되는 부분을 테스트하고, 비즈니스 테스트와 문제가 없도록 조율한다. +* 애플리케이션의 기술적 기능과 IT 아키텍처와의 연동을 테스트하고, 비즈니스 테스트와 문제가 없도록 조율한다. -* 기술 및 비즈니스 관점에서 "정상" 및 "어뷰징" 테스트 케이스를 생성한다. +* 기술 및 비즈니스 관점에서 "정상 사용" 및 "악용" 테스트 케이스를 생성한다. -* 내부 프로세스, 보호 요구 사항 및 애플리케이션의 예상 위협 수준에 따라 보안 테스트를 관리합니다. +* 내부 프로세스, 보호 요구 사항 및 애플리케이션의 예상 위협 수준에 따라 보안 테스트를 관리한다. * 개발팀이 사용할 보안 테스트 도구(퍼저, 동적 애플리케이션 보안 테스트 등)와 안전한 테스트 환경, 사용 교육을 제공한다. 또는 개발팀을 대신해 테스트를 수행하거나 테스터를 투입한다. @@ -143,7 +143,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 ### 배포 -* 애플리케이션을 운영환경에 배포하고, 필요요 시 기존 시스템에서 신규 시스템으로 마이그레이션을 수행한다. +* 애플리케이션을 운영환경에 배포하고, 필요 시 기존 시스템에서 신규 시스템으로 마이그레이션을 수행한다. * 구성 관리 데이터베이스와 보안 아키텍처를 포함한 모든 문서를 최종 확정한다. @@ -152,11 +152,11 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 운영시 애플리케이션의 보안 관리를 위한 가이드라인(예: 패치 관리)이 포함되어야 한다. -* 사용자의 보안 인식을 제고하고, 사용성과 보안성 간의 문제를 관리한다. +* 사용자의 보안 인식을 제고하고, 사용성과 보안성 간의 상충을 관리한다. * 변경(changes)을 계획하고 관리한다. 예를 들어 애플리케이션의 신규 버전 또는 OS, 미들웨어, 라이브러리와 같은 기타 구성요소로의 버전 업데이트를 포함한다. -* 모든 애플리케이션이 인벤토리에 등록되어 있으며, 모든 중요 세부사항이 문서화되어 있음을 보장한다. 구성 관리 데이터베이스 및 보안 아키텍처, 통제항목, 대응방안, 런북(runbook) 또는 프로젝트 문서 포함을 포함한 모든 문서를 최신 상태로 유지한다. +* 모든 애플리케이션이 인벤토리에 등록되어 있으며, 모든 중요 세부사항이 문서화되어 있음을 보장한다. 구성 관리 데이터베이스 및 보안 아키텍처, 통제항목, 대응방안, 런북(runbook) 또는 프로젝트 문서를 포함한 모든 문서를 최신 상태로 유지한다. * 모든 애플리케이션에 대해 로깅, 모니터링, 알림(alert)를 수행한다. 누락된 경우 추가한다. @@ -193,7 +193,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 OWASP Top 10은 주로 인식 제고 문서이다. 그러나 이는 2003년 처음 발표된 이후로 조직들이 이를 사실상(de facto) 업계 애플리케이션 보안 표준으로 사용해 온 상황을 막지 못했다. OWASP Top 10을 코딩 또는 테스트 표준으로 사용하려는 경우, 이것이 최소 수준의 베이스라인이며 단지 출발점에 불과하다는 점을 인지해야 한다. -OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리케이션 보안 위험을 문서화 한 것이며, 쉽게 테스트 가능한 위험을 다루는 것은 아니라는 점이다. 예를 들어 [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)은 대부분의 테스트하기 어렵다. 또 다른 예로, 로깅 및 모니터링이 실제로, 사용 중이며 효과적으로 구현되었는지 여부를 테스트하는 것은 인터뷰와 사고 대응 사례 샘플링하는 방식으로만 가능하다. 정적 코드 분석 도구는 로깅 부재를 탐지할 수 있으나, 비즈니스 로직 또는 접근 통제가 위험한 보안 사고를 로깅하는지 여부를 판단하는 것은 불가능할 수 있다. 침투 테스트 역시 테스트 환경에서의 탐지/대응 확인에 그칠 수 있으며, 테스트 환경은 운영 환경과 동일한 수준이 아닌 않는 경우가 많다. +OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리케이션 보안 위험을 문서화 한 것이며, 쉽게 테스트 가능한 위험을 다루는 것은 아니라는 점이다. 예를 들어 [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)은 대부분의 테스트 방식으로는 검증하기가 어렵다. 또 다른 예로, 로깅 및 모니터링이 실제로 적용되어 있고, 사용 중이며, 효과적으로 동작하는지 여부를 테스트하는 것은 인터뷰와 사고 대응 사례 샘플링하는 방식으로만 가능하다. 정적 코드 분석 도구는 로깅 부재를 탐지할 수 있으나, 비즈니스 로직 또는 접근 통제가 위험한 보안 사고를 로깅하는지 여부를 판단하는 것은 불가능할 수 있다. 침투 테스트 역시 테스트 환경에서의 탐지/대응 확인에 그칠 수 있으며, 테스트 환경은 운영 환경과 동일한 수준이 아닌 아닌 경우가 많다. 아래는 OWASP Top 10을 표준으로 활용하기에 적절한 상황에 대한 권고사항이다: @@ -297,6 +297,6 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 -애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능 하게 정의하도록 설계되었고 보안 안전한 안전한 개발 주기(SDLC) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)]((https://owasp.org/www-project-application-security-verification-standard/))를 기준으로 활용하는 것을 권고한다. +애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능하게 정의하도록 설계되었고 보안 안전한 개발 수명 주기(SDLC) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)]((https://owasp.org/www-project-application-security-verification-standard/))를 기준으로 활용하는 것을 권고한다. -특히 보안 도구 벤더 관점에서는 ASVS를 기준으로 삼는 것이 유일한 선택지이다. OWASP Top 10은 위험 중심으로 구성되어 있기에, [A06:2025 - Insecure Design](A06_2025-Insecure_Design.md) 사례와 마찬가지로 자동화 도구만으로 모든 Top 10 항목을 포괄적으로 탐지, 테스트, 방어하기 어렵다. 따라서, OWASP는 Top 10을 전부 보장한다는 주장을 지양하도록 안내한다. +특히 보안 도구 벤더 관점에서는 ASVS를 기준으로 삼는 것이 유일한 선택지이다. OWASP Top 10은 위험 중심으로 구성되어 있기에, [A06:2025 - Insecure Design](A06_2025-Insecure_Design.md) 사례와 마찬가지로 자동화 도구만으로 모든 Top 10 항목을 포괄적으로 탐지, 테스트, 방어하기 어렵다. 따라서, 벤더들은 Top 10을 전부 보장한다고 주장하지 않았으면 한다. 왜냐하면 이는 사실이 아니기 때문이다. From 9cad026e5ef549c07fa885a3cb830b357adae332 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 17:34:41 +0900 Subject: [PATCH 071/167] Reflect review feedback --- ...3_2025-Establishing_a_Modern_Application_Security_Program.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 74c122070..24a68e060 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -36,7 +36,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 기존 개발 및 운영 프로세스에 안전한 구현 및 검증 활동을 정의하고 내재화한다. -* 검증 활동에는 위협 모델링, 안전한 설계 및 설계 검토, 시큐어 코딩 및 코드 리뷰, 침투 테스트, 그리고 취약점 조치가 포함된다. +* 구현 및 검증 활동에는 위협 모델링, 안전한 설계 및 설계 검토, 시큐어 코딩 및 코드 리뷰, 침투 테스트, 그리고 취약점 조치가 포함된다. * 개발 및 프로젝트 팀이 각 활동을 성공적으로 수행할 수 있도록 주제별 분야 전문가(subject matter expert)와 지원 서비스를 제공한다. From 5a09243ff373beeb89391b7d97990f935cc738c3 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 18:35:11 +0900 Subject: [PATCH 072/167] Reflect review feedback --- 2025/docs/ko/A05_2025-Injection.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index 2a2c51e05..c16873caf 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -2,7 +2,7 @@ ## 배경. -인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화(크로스 사이트 스크립팅)에 대한 보고된 CVE 수가 매우 많아 이 범주의 평균 가중 영향도가 낮아졌다. +인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 체계 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화(크로스 사이트 스크립팅)에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향도가 낮아졌다. ## 점수표. @@ -60,10 +60,10 @@ * 사용자가 제공한 데이터가 애플리케이션에 의해 검증, 필터링 또는 새니타이징되지 않는 경우. * 동적 쿼리 또는 파라미터 바인딩이 없는 호출을 해당 컨텍스트에 맞는 이스케이프 없이 인터프리터에 직접 전달하는 경우. -* 객체 관계형 매핑(object-relational mapping, ORM) 검색 파라미터에 새니타이징 되지 않은 입력값을 사용하여, 의도하지 않은 추가 민감 데이터 레코드를 조회하는 경우. +* 객체 관계형 매핑(object-relational mapping, ORM) 검색 파라미터에 새니타이징되지 않은 입력값을 사용하여, 의도하지 않은 추가 민감 데이터 레코드를 조회하는 경우. * 잠재적으로 악의적일 수 있는 데이터가 그대로 사용되거나, 기존 SQL 또는 커맨드 뒤에 문자열로 이어 붙여지는 경우. 그 결과 동적 쿼리, 커맨드, 또는 저장 프로시저에서 원래의 구문과 공격자가 주입한 악성 데이터가 함께 포함되게 된다. -대표적인 인젝션 유형으로는 SQL, NoSQL, OS 커맨드, 객체 관계형 매핑(ORM), LDAP, 그리고 EL 표현식(Expression Language) 및 OGNL 표현식(Object Graph Navigation Library) 인젝션 있다. 인터프리터 종류가 달라도 핵심 원리는 동일하다. 효과적인 탐지를 위해서는 소스 코드 리뷰와 함께, 모든 파라미터, 헤더, URL, 쿠키, JSON, SOAP, 및 XML 데이터 입력에 대한 자동화(퍼징 포함) 테스트하는 게 좋다. CI/CD 파이프라인에 정적(SAST), 동적(DAST), 및 인터랙티브(IAST) 애플리케이션 보안 테스트 도구를 통합하여, 것도 운영 환경 배포 전에 인젝션 결함을 식별하는 데 도움이 될 수 있다. +대표적인 인젝션 유형으로는 SQL, NoSQL, OS 커맨드, 객체 관계형 매핑(ORM), LDAP, 그리고 EL 표현식(Expression Language) 및 OGNL 표현식(Object Graph Navigation Library) 인젝션이 있다. 인터프리터 종류가 달라도 핵심 원리는 동일하다. 효과적인 탐지를 위해서는 소스 코드 리뷰와 함께, 모든 파라미터, 헤더, URL, 쿠키, JSON, SOAP, 및 XML 데이터 입력에 대한 자동화(퍼징 포함) 테스트하는 게 좋다. CI/CD 파이프라인에 정적(SAST), 동적(DAST), 및 인터랙티브(IAST) 애플리케이션 보안 테스트 도구를 통합하여, 것도 운영 환경 배포 전에 인젝션 결함을 식별하는 데 도움이 될 수 있다. 한편 LLM 환경에서도 유사한 계열의 인젝션 취약점이 흔해지고 있다. 이는 [OWASP LLM Top 10](https://genai.owasp.org/llm-top-10/)에서 별도로 다룬다. 특히 [LLM01:2025 프롬프트 인젝션](https://genai.owasp.org/llmrisk/llm01-prompt-injection/) 항목에서 관련 내용을 확인할 수 있다. @@ -72,14 +72,14 @@ 인젝션 공격을 예방하는 최선의 방법은 데이터를 명령 및 쿼리로부터 분리하여 유지하는 것이다. -* 가장 권장되는 방식은 안전한 API를 사용하는 것이다. 이는 인터프리터를 전혀 사용하지 않거나, 입력값을 파라미터 화하도록 하는 인터페이스를 제공하거나, 객체 관계형 매핑(ORM) 도구를 사용하는 방식을 통해 이를 달성할 수 있다. +* 가장 권장되는 방식은 안전한 API를 사용하는 것이다. 이는 인터프리터를 전혀 사용하지 않거나, 입력값을 파라미터화하도록 하는 인터페이스를 제공하거나, 객체 관계형 매핑(ORM) 도구를 사용하는 방식을 통해 이를 달성할 수 있다. **참고:** 저장 프로시저는 파라미터화되어 있더라도, PL/SQL 또는 T‑SQL 내부에서 문자열 결합으로 쿼리와 데이터를 연결하거나, EXECUTE IMMEDIATE / exec()처럼 동적 실행 기능으로 적대적 입력을 실행하면 SQL 인젝션이 발생할 수 있다. -데이터를 커맨드로 분리하는 것이 불가능한 경우, 다음 방법을 사용하여 위협을 줄일 수 있다. +데이터를 커맨드로부터 분리하는 것이 불가능한 경우, 다음 방법을 사용하여 위협을 줄일 수 있다. -* 서버 측 입력값 검증은 허용 목록 기반을 사용한다. 다만 텍스트 입력란이나 모바일 API처럼 특수문자 입력이 필요한 경우가 많아, 이것만으로는 완전한 방어가 되기 어렵다. +* 서버 측 입력값 검증은 허용 목록 기반(positive validation)을 사용한다. 다만 텍스트 입력란이나 모바일 API처럼 특수문자 입력이 필요한 경우가 많아, 이것만으로는 완전한 방어가 되기 어렵다. * 불가피하게 동적 쿼리를 사용하는 지점이 남아 있다면, 사용 중인 인터프리터에서 사용하는 규칙에 맞춰 특수문자를 이스케이프 처리한다. -**참고:** 테이블 명과 칼럼 명 같은 SQL 구문들은 이스케이프 할 수 없으므로, 사용자가 제공한 입력값을 쓰는 것은 위험하다. 이런 문제는 보고서 생성 기능에서 자주 나타난다. +**참고:** 테이블 명과 칼럼 명 같은 SQL 구문들은 이스케이프할 수 없으므로, 사용자가 제공한 입력값을 쓰는 것은 위험하다. 이런 문제는 보고서 생성 기능에서 자주 나타난다. **경고** 위 방법들은 문자열을 파싱하고 이스케이프하는 복잡한 처리를 전제로 하며, 구현 실수가 발생하기 쉽고 시스템 내부 동작이 조금만 바뀌어도 방어가 쉽게 무력화될 수 있다. @@ -105,9 +105,9 @@ http://example.com/app/accountView?id=' OR '1'='1 Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'"); ``` -공격자는 입력값으로 `' OR custID IS NOT NULL OR custID='`를 입력한다. 이는 필터를 우회하고 모든 계정의 레코드를 반환한다. HQL은 로우 raw SQL보다 위험한 함수가 더 적지만, 사용자 입력 값이 쿼리의 문자열로 연결될 때 여전히 허용되지 않은 데이터에 접근할 수 있다. +공격자는 입력값으로 `' OR custID IS NOT NULL OR custID='`를 입력한다. 이는 필터를 우회하고 모든 계정의 레코드를 반환한다. HQL은 로우(raw) SQL보다 위험한 함수가 더 적지만, 사용자 입력 값이 쿼리의 문자열로 연결될 때 여전히 권한이 없는 데이터 접근할 수 있다. -**시나리오 3:** 애플리케이션이 사용자 입력을 OS 커맨드으로 사용한다. +**시나리오 3:** 애플리케이션이 사용자 입력을 OS 커맨드로 사용한다. ``` String cmd = "nslookup " + request.getParameter("domain"); From 80248b642217c6031761daa220d0bf58b2831db6 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 19:27:53 +0900 Subject: [PATCH 073/167] Reflect review feedback --- 2025/docs/ko/A06_2025-Insecure_Design.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 38300436a..e34336e31 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -3,7 +3,7 @@ ## 배경. -안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위으로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 의도하지 않은 단계로 시스템 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, Secure by Design의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장 해야한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*가 있다. +안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위으로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, Secure by Design의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. @@ -57,9 +57,9 @@ ## 설명. -안전하지 않은 설계는 다양한 유형의 약점을 포괄하는 범주로, 주로 "빠졌거나 비효과적인 통제 설계"로 나타난다. 또한 이 카테고리가 다른 모든 Top 10 위험의 근본 원인이라고 보기는 어렵다. 안전하지 않은 설계와 안전하지 않은 구현은 차이가 있다. 안전하지 않은 설계와 안전하지 않은 구현은 구분되어야 하며, 설계 결함과 구현 결함은 근본 원인이 다르며, 개발 과정에 발생 시점이 다르며, 그리고 개선 방법이 서로 다르다. 안전한 설계를 하더라도 구현상 결함을 가질 수 있으며, 이에 따라 취약점이 발생할 수 있다. 안전하지 않은 설계는 필요한 보안 통제가 특정 공격에 대해 방어하기 위해 대비되지 않았기 때문에, 완벽한 구현만으로는 수정될 수 없다. 안전하지 않은 설계의 원인 중 하나는 개발 대상 소프트웨어 및 시스템에 대한 비즈니스 리스크 프로파일링이 부족한 것이며, 그 결과 요구되는 보안 설계 수준을 적절히 산정하지 못하는 것이다. +안전하지 않은 설계는 다양한 유형의 약점을 포괄하는 범주로, 주로 "빠졌거나 비효과적인 통제 설계"로 나타난다. 또한 이 카테고리가 다른 모든 Top 10 위험의 근본 원인이라고 보기는 어렵다. 안전하지 않은 설계와 안전하지 않은 구현은 차이가 있어 구분되어야 하며, 설계 결함과 구현 결함은 근본 원인이 다르며, 개발 과정에서의 발생 시점이 다르고, 그리고 개선 방법도 다르다. 안전한 설계를 하더라도 구현상 결함을 가질 수 있으며, 이에 따라 취약점이 발생할 수 있다. 안전하지 않은 설계는 필요한 보안 통제가 특정 공격에 대해 방어하기 위해 대비되지 않았기 때문에, 완벽한 구현만으로는 수정될 수 없다. 안전하지 않은 설계의 원인 중 하나는 개발 대상 소프트웨어 및 시스템에 대한 비즈니스 리스크 프로파일링이 부족한 것이며, 그 결과 요구되는 보안 설계 수준을 적절히 산정하지 못하는 것이다. -보안 설계를 갖추는 데의 세 가지 핵심 구성요소는 다음과 같다. +보안 설계를 갖추기 위한 세 가지 핵심 구성요소는 다음과 같다. * 요구사항 수집 및 리소스 관리 * 안전한 설계 수립 @@ -68,12 +68,12 @@ ### 요구사항 수집 및 리소스 관리 -비즈니스 부서와 협업하여 애플리케이션의 비즈니스 요구사항을 수집 및 조율하며, 모든 데이터 자산과 예상되는 비즈니스 로직에 대해 기밀성, 무결성, 가용성, 인증성 관점의 보호 요구사항을 함께 정의한다. 애플리케이션의 대외 노출 수준을 고려하고, 그리고 단순 접근 제어 수준을 넘어서는 테넌트 격리가 필요한지 아닌지를 고려하라. 기능 요구사항뿐 아니라 비기능 보안 요구사항까지 포함해 기술 요구사항을 정리한다. 보안 활동을 포함하여 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의하라. 또한, 보안 활동을 포함한 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의하라. +비즈니스 부서와 협업하여 애플리케이션의 비즈니스 요구사항을 수집 및 조율하며, 모든 데이터 자산과 예상되는 비즈니스 로직에 대해 기밀성, 무결성, 가용성, 인증성 관점의 보호 요구사항을 함께 정의한다. 애플리케이션의 대외 노출 수준을 고려하고, 그리고 단순 접근 제어 수준을 넘어서는 테넌트 격리가 필요한지 아닌지를 고려하라. 기능 요구사항뿐 아니라 비기능 보안 요구사항까지 포함해 기술 요구사항을 정리한다. 또한, 보안 활동을 포함한 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의하라. ### 안전한 설계 -안전한 설계는 지속적으로 위협을 평가하고, 알려진 공격 기법을 방지하기 위해 코드가 견고하게 설계되고 테스트 되도록 보장하는 문화이자 방법론이다. 위협 모델링은 요구사항 개선(refinement) 단계(혹은 유사한 활동)에 내재화되어야 하며, 이 과정에서 데이터 흐름과 접근 제어 또는 기타 보안 통제의 변화를 중심으로 검토해야 한다. 유저 스토리를 작성할 때 정상 흐름과 실패 흐름을 결정하고, 책임 당사자 및 영향받는 당사자가 이를 충분히 이해하고 합의했는지 확인하라. 또한 정상과 실패 흐름에 대한 가정과 조건을 분석하여 정확하고 바람직한 상태로 유지되는지 확인하라. 올바른 동작을 위해 필요한 가정과 조건을 어떻게 검증하고 강제할지 결정한다. 이 결과는 유저 스토리에 문서로 만들어져야 한다. 과정 중에 발생하는 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공하라. 마지막으로, 안전한 설계는 개발이 완료된 이후에 추가할 수 있는 부가 기능도 아니고 도구도 아니다. +안전한 설계는 지속적으로 위협을 평가하고, 알려진 공격 기법을 방지하기 위해 코드가 견고하게 설계되고 테스트 되도록 보장하는 문화이자 방법론이다. 위협 모델링은 요구사항 개선(refinement) 단계(혹은 유사한 활동)에 내재화되어야 하며, 이 과정에서 데이터 흐름과 접근 제어 또는 기타 보안 통제의 변화를 중심으로 검토해야 한다. 유저 스토리를 작성할 때 정상 흐름과 실패 흐름을 결정하고, 책임 당사자 및 영향받는 당사자가 이를 충분히 이해하고 합의했는지 확인하라. 또한 정상과 실패 흐름에 대한 가정과 조건을 분석하여 정확하고 바람직한 상태로 유지되는지 확인하라. 올바른 동작을 위해 필요한 가정과 조건을 어떻게 검증하고 강제할지 결정한다. 이 결과는 유저 스토리에 문서화되어야 한다. 과정 중에 발생하는 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공하라. 마지막으로, 안전한 설계는 개발이 완료된 이후에 추가할 수 있는 부가 기능도 아니고 도구도 아니다. ### 보안 개발 생명주기 @@ -92,7 +92,7 @@ * 보안 마인드셋을 생성하기 위한 교육 도구로서 위협 모델링을 사용하라. * 유저 스토리에 보안 요구사항과 보안 통제를 반영하라. * 애플리케이션의 각 계층(프론트엔드부터 백엔드까지)에 요청과 데이터가 타당한지 검증하는 절차를 추가한다. -* 위협 모델에 기반해 핵심 흐름의 안전한지 검증하는 단위 및 통합 테스트를 구현하고, 애플리케이션 계층별 정상 시나리오*와* 악용 시나리오를 취합한다. +* 위협 모델에 기반해 핵심 흐름이 안전한지 검증하는 단위 및 통합 테스트를 구현하고, 애플리케이션 계층별 정상 시나리오*와* 악용 시나리오를 취합한다. * 외부 노출 수준과 보호 필요도에 따라 시스템 및 네트워크 레벨에서 분리한다. * 전 계층에 걸쳐 설계 단계부터 테넌트 격리(tenant isolation)를 강하게 보장한다. * 전 계층에서 테넌트를 구조적으로 격리되도록 하라. @@ -102,7 +102,7 @@ **시나리오 1:** 계정 복구 절차에 "질문-답변 방식"을 넣는 경우가 있는데, 이는 NIST 800-63b, OWASP ASVS 및 OWASP Top 10에서 금지하는 설계다. 질문-답변은 여러 사람이 답을 알고 있을 수 있어 본인 확인의 근거로 신뢰하기 어렵다. 따라서 해당 기능은 제거하고, 보다 안전한 복구 설계로 대체하는 것이 바람직하다. -**시나리오 2:** 영화관 체인이 단체 예매 할인 정책을 운용하며, 참석 인원이 15명을 초과하면 보증금을 요구한다고 가정한다. 공격자는 이 예약 흐름을 위협 모델링한 뒤 비즈니스 로직의 허점을 찾아, 예컨대 소수의 요청(15명 이하로 여러 번)만으로 지점의 전체 좌석을 대량으로 선점해 매출 손실을 유발할 수 있다. +**시나리오 2:** 한 영화관 체인이 단체 예매 할인 정책을 운용하며, 참석 인원이 15명을 초과하면 보증금을 요구한다고 가정한다. 공격자는 이 예약 흐름을 위협 모델링한 뒤 비즈니스 로직의 허점을 찾아, 몇 번의 요청(14명으로 여러번)만으로 전 지점에 걸쳐 좌석 600석을 동시에 예약해 매출 손실을 유발할 수 있다. **시나리오 3:** 한 유통 체인의 전자상거래 사이트가 리셀러 구매 봇을 차단하지 못하면, 고가 그래픽카드가 대량 매집되어 리셀 채널로 흘러갈 수 있다. 이는 제조사와 유통사 모두에 대한 부정적 여론을 초래하고, 해당 제품을 어떤 가격에서도 구할 수 없었던 마니아층의 반감을 장기화한다. 제품 판매 개시 직후 극단적으로 짧은 시간 내 구매, 비정상 다량 구매 등 도메인 규칙 기반의 봇 방어 설계를 적용하면, 비정상 구매를 탐지해 거래를 거절할 수 있다. From 4022aa4e5ba14fe287b458a5619acab66bb7604d Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 19:36:20 +0900 Subject: [PATCH 074/167] Reflect review feedback --- 2025/docs/ko/A07_2025-Authentication_Failures.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index a000f8f38..794ca1433 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -64,13 +64,13 @@ * 기본 비밀번호, 취약한 비밀번호 또는 널리 알려진 비밀번호를 허용하는 경우. 예를 들어 "Password1"와 같은 비밀번호나 "admin" 사용자명과 "admin" 비밀번호와 같은 조합이 있다. -* 이미 유출된 아이디 및 비밀번호로 사용자가 새 계정을 생성할 수 있느 경우. +* 이미 유출된 아이디 및 비밀번호로 사용자가 새 계정을 생성할 수 있는 경우. * 안전하지 않은 "질문-답변 방식 비밀번호 찾기"과 같은 취약하거나 비효율적인 자격 증명 복구 및 비밀번호 찾기 프로세스를 사용하는 경우. * 평문, 암호화된, 또는 약한 해시(hash)로 해시된 비밀번호를 사용하는 경우. [A04:2025-Cryptographic Failures](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/) 참고. -* 다중 인증(MFA)이 이 누락되어 있거나 효과적이지 않은 경우. +* 다중 인증(MFA)이 누락되어 있거나 효과적이지 않은 경우. * 다중 인증을 사용할 수 없을 때 적용되는 대체 수단(fallback)이 취약하거나 효과적이지 않은 경우. @@ -102,19 +102,19 @@ * 로그인 실패에 대해 횟수 제한 또는 점진적인 지연을 적용하되, 과도한 통제로 DoS(denial of service)가 유발되지 않도록 설계한다. 또한 실패 이벤트를 로깅하고 크리덴셜 스터핑이나 무차별 대입 공격 징후 탐지 시 관리자에게 알림을 발송한다. -* 세션은 높은 엔트로피를 가진 새로운 무작위 세션 ID를 생성하는 서버 측의 안전한 내장 세션 관리자를 사용한다. 세션 식별자는 URL에 포함되지 않아야 하며, 쿠키에 안전하게 저장되고, 로그아웃, 유휴 시간이 지나거나 및 최대 세션 시간 이후 무효가 되어야 한다. +* 세션은 높은 엔트로피를 가진 새로운 무작위 세션 ID를 생성하는 서버 측의 안전한 내장 세션 관리자를 사용한다. 세션 식별자는 URL에 포함되지 않아야 하며, 쿠키에 안전하게 저장되고, 로그아웃하거나 유휴 시간 및 최대 세션 시간 초과 시 무효가 되어야 한다. -* 가능하면 인증, 아이덴티티, 세션 관리를 자체 구현하기보다 사전 제작된, 신뢰할 수 있는 시스템을 사용한다. 가능하다면 검증되고 충분히 테스트 된 도구를 구매/활용해 구현 위험을 줄인다. +* 가능하면 인증, 아이덴티티, 세션 관리를 자체 구현하기보다 사전 제작된, 신뢰할 수 있는 시스템을 사용한다. 가능하다면 검증되고 충분히 테스트된 도구를 구매/활용해 구현 위험을 줄인다. -* 제공된 자격 증명의 어디에 무엇을 위해 사용되는지 검증한다. 예를 들어 JWT의 경우 `aud`와 `iss` 클레임(claim) 및 스코프(scope)를 검증한다. +* 제공된 자격 증명의 의도된 용도를 검증한다. 예를 들어 JWT의 경우 `aud`와 `iss` 클레임(claim) 및 스코프(scope)를 검증한다. ## 공격 시나리오 예시. **시나리오 1:** 크리덴셜 스터핑은 유출된 계정-비밀번호 조합을 자동으로 대입하는 대표적인 공격이다. 최근에는 사람들의 습관을 악용해 비밀번호의 숫자를 증가 및 감소시켜 가며 공격하는 사례가 확인되고 있다. 예를 들어, 예를 들어 'Winter2025'를 'Winter2026'으로 바꾸거나, 'ILoveMyDog6'를 'ILoveMyDog7' 또는 'ILoveMyDog5'로 바꾸는 식이다. 이러한 공격을 하이브리드 크리덴셜 스터핑 공격 또는 패스워드 스프레이 공격이라고 하며, 기존의 크리덴셜 스터핑보다 더 효과적일 수 있다. 애플리케이션이 자동화된 위협(무차별 대입, 스크립트, 봇) 또는 크리덴셜 스터핑에 대한 방어를 구현하지 않으면, 해당 애플리케이션은 자격 증명이 유효한지 여부를 판별하는 패스워드 오라클로 악용되어 비인가 접근을 획득하는 데 사용될 수 있다. -**시나리오 2:** 인증 공격의 상당수는 비밀번호만으로 인증을 구성하는 구조에서 발생한다. 과거에 권장되던 주기적 비밀번호 변경 및 과도한 복잡도 정책은 오히려 비밀번호 재사용을 늘리고 기억하기 쉬운 취약 패턴을 만들 수 있다. 따라서 NIST 800-63의 권고에 맞춰 불필요한 정책을 지양하고, 중요 시스템에는 다중 인증(MFA)을 기본으로 강제 적용하는 것이 바람직하다.es per NIST 800-63 and to enforce use of multi-factor authentication on all important systems. +**시나리오 2:** 인증 공격의 상당수는 비밀번호만으로 인증을 구성하는 구조에서 발생한다. 과거에 권장되던 주기적 비밀번호 변경 및 과도한 복잡도 정책은 오히려 비밀번호 재사용을 늘리고 기억하기 쉬운 취약 패턴을 만들 수 있다. 따라서 NIST 800-63의 권고에 맞춰 불필요한 정책을 지양하고, 중요 시스템에는 다중 인증(MFA)을 기본으로 강제 적용하는 것이 바람직하다. -**시나리오 3:** 애플리케이션의 세션 타임아웃이 올바르게 구현되지 않았다. 사용자가 공용 컴퓨터에서 애플리케이션에 접근한 뒤 "로그아웃" 버튼 대신에 대신 브라우저 탭을 닫고 자리를 떠난다. 또 다른 예로, 로그아웃으로 SSO(Single Sign on) 세션을 종료할 수 없는 경우가 있다. 즉, SSO로 메일, 문서 시스템, 채팅 시스템에 로그인되지만, 로그아웃은 사용하는 시스템만 로그아웃된다. 성공적으로 로그아웃했다고 생각한 브라우저를 사용하되 일부 애플리케이션에서 사용자가 여전히 인증된 상태라면, 피해자 계정에 접근할 수 있다. 이 상태에서 공격자가 같은 브라우저를 사용하면, 다른 애플리케이션에는 세션이 남아 있어 피해자 계정에 접근이 가능해진다. 동일한 문제는 민감한 애플리케이션이 적절히 종료되지 않은 상태에서 동료가 잠금 해제된 컴퓨터에 (일시적으로) 접근할 수 있는 사무실/기업 환경에서도 발생할 수 있다. +**시나리오 3:** 애플리케이션의 세션 타임아웃이 올바르게 구현되지 않았다. 사용자가 공용 컴퓨터에서 애플리케이션에 접근한 뒤 "로그아웃" 버튼 대신 브라우저 탭을 닫고 자리를 떠난다. 또 다른 예로, SSO(Single Sign-On) 환경에서 단일 로그아웃(Single Logout)이 지원되지 않는 경우가 있다. 즉, SSO로 메일, 문서 시스템, 채팅 시스템에 한 번에 로그인되지만, 로그아웃은 현재 사용 중인 시스템에서만 로그아웃 처리된다. 이 상태에서 공격자가 동일한 브라우저를 사용하면, 다른 애플리케이션에는 세션이 남아 있어 피해자 계정에 접근할 수 있다. 동일한 문제는 민감한 애플리케이션이 적절히 종료되지 않은 상태에서 동료가 잠금 해제된 컴퓨터에 일시적으로 접근할 수 있는 사무실 환경에서도 발생할 수 있다. ## 참조. From 83304b16e8c77331e50fe8b20e53a72743e8c6c9 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 19:44:55 +0900 Subject: [PATCH 075/167] typo --- 2025/docs/ko/A06_2025-Insecure_Design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index e34336e31..0dad83da3 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -3,7 +3,7 @@ ## 배경. -안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위으로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, Secure by Design의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. +안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, Secure by Design의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. From 0d725b125513390850811ab911d91835150228b0 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 19:49:44 +0900 Subject: [PATCH 076/167] Update improving formatting --- ...025-What_are_Application_Security_Risks.md | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index 234f56aaf..18639c8e7 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -9,35 +9,26 @@ 위협 행위자 - 공격 \ -벡터 + 공격 벡터 +

악용 가능성 - 보안 미비 가능성 -

- - 통제 + 보안 통제 미비 가능성 +

- 기술적 -

- - 영향 + 기술적 영향 - 비즈니스 -

- - 영향 + 비즈니스 영향 - 환경에 따라, \ -상황에 따라 동적으로 변화 + 환경에 따라, 상황에 따라 동적으로 변화 애플리케이션 노출 수준에 따라(환경 기준) @@ -46,9 +37,7 @@ 평균 가중 악용 - 통제 누락을 \ -평균 발생률로 산정하고 \ -커버리지로 가중 + 통제 누락을 평균 발생률로 산정하고 커버리지로 가중 평균 가중 영향 From 98abc3412d4c13bf7e41283e6a67edb90c800486 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 20:01:48 +0900 Subject: [PATCH 077/167] typo and improving formatting --- .../docs/ko/A01_2025-Broken_Access_Control.md | 30 +++++++++---------- .../ko/A02_2025-Security_Misconfiguration.md | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md index e50507dc8..1e12565cd 100644 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -4,7 +4,7 @@ ## 배경. -불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할만한 CWE는 CWE-200: 비인기자에게 민감정보 노출, CWE-201: 전송된 데이터로부터의 민감정보 노출, `CWE-918: 서버측 요청 위조(SSRF)`, 그리고 `CWE-352: 크로스 사이트 요청 위조(CSRF)` 가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. +불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할만한 CWE는 *CWE-200: 비인기자에게 민감정보 노출*, *CWE-201: 전송된 데이터로부터의 민감정보 노출*, *CWE-918: 서버측 요청 위조(SSRF)*, 그리고 *CWE-352: 크로스 사이트 요청 위조(CSRF)* 가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. ## 점수표. @@ -21,9 +21,9 @@ 평균 테스트 커버리지 - 가중 평균 악용도 + 평균 가중 악용도 - 가중 평균 영향도 + 평균 가중 영향도 총 발생 건수 @@ -56,16 +56,16 @@ ## 설명. -접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 접근 제어 실패는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제(파괴), 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔히 발견되는 불충분한 접근 제어 취약점은 목록은 다음과 같다. +접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 접근 제어 실패는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제, 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔히 발견되는 불충분한 접근 제어 취약점은 목록은 다음과 같다. * 최소 권한 원칙 위반, 우선 거부 정책(Deny by Default)이 적용되지 않아 제한된 기능, 역할, 사용자들에게만 허용된 접근 권한이 불특정 다수에게 허용되는 경우. -* 조작된 URL(파라미터 변조 또는 강제 브라우징), 애플리케이션 내부 상태값 변조, HTML 페이지 조작 또는 공격 도구를 통해 API 요청을 조작함으로써 접근 제어 검사 우회가 가능한 경우 -* 고유 식별자를 이용해 권한이 필요한 다른 사용자 계정을 조회 또는 수정할 수 있는 경우(안전하지 않은 직접 객체 참조, Insecure Direct Object References) -* 접근 가능한 API의 POST, PUT, DELETE 메서드에 대한 접근 제어가 없는 경우 -* 권한 상승. 로그인 과정 없이 다른 사용자로 가장하거나 또는 사용자가 보유한 이상의 권한을 획득하는 경우. (예시. 관리자 접근 권한) -* 메타데이터 조작, 예를 들어 JWT 토큰, 접근 통제 토큰, 쿠키 또는 히든 필드 값을 수정하여 재전송 하거나 위조하여 권한 상승하는 경우 또는 JWT 무효화가 없거나 우회하여 악용하는 경우 -* 교차 출처 리소스 공유 (Cross-Origin Resource Sharing, CORS)의 잘못된 설정으로 비인가자 또는 신뢰할 수 없는 출처(Origin)로부터 API 접근을 허용하는 경우 -* 강제 브라우징 (URL 예측)을 통해 인증이 필요한 페이지에 인증없이 접근하거나, 일반 사용자가 권한이 필요한 페이지에 접근할 경우 +* URL 조작(파라미터 변조 및 강제 브라우징), 애플리케이션 내부 상태값 변조, HTML 페이지 변조, 공격 도구를 통한 API 요청 변조와 같은 방식으로 접근 제어가 우회될 수 있다. +* 고유 식별자를 이용해 타인의 계정 조회 수정하는 경우. 즉, 안전하지 않은 직접 객체 참조(Insecure Direct Object References) 취약점. +* 접근 가능한 API의 POST, PUT 및 DELETE 메서드에 대한 접근 제어가 없는 경우. +* 권한 상승. 로그인 과정 없이 다른 사용자로 가장하거나 또는 사용자가 보유한 이상의 권한(예: 관리자 권한)을 획득하는 경우. +* 메타데이터 조작. 예를 들어 JSON Web Token(JWT) 접근 제어 토큰을 재전송하거나 변조하는 경우, 권한을 상승시키기 위해 쿠키 또는 히든 필드 값을 조작하는 행위, 또는 JWT 무효화가 없거나 우회하여 악용하는 경우. +* 교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)의 잘못된 설정으로 비인가자 또는 신뢰할 수 없는 출처(Origin)에서 API에 접근할 수 있는 경우. +* 강제 브라우징(URL 추측)을 통해 인증이 필요한 페이지에 인증없이 접근하거나, 일반 사용자가 권한이 필요한 페이지에 접근할 경우. ## 대응 방안. @@ -78,8 +78,8 @@ * 접근제어 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 리소스 검증(CORS) 사용을 최소화 한다. * 모델 수준의 접근 제어는 레코드 소유자 기준으로 접근 권한을 제한하도록 한다. 다른 사용자가 임의의 레코드에 대해 생성, 조회, 수정, 삭제를 수행하도록 하지 못하게 한다. * 애플리케이션의 고유한 비즈니스 제약사항은 도메인 모델에 의해 검사한다. -* 웹 서버 디렉토리 리스팅 비활성화 여부와 웹 루트에 파일 메타데이터 및 (예시. .git 디렉토리) 백업 파일이 존재하지 않는지 확인한다. -* 접근 제어 실패를 로깅하고 필요한 경우엔 관리자에게 알린다. (예시. 반복적 실패 또는 비정상적 접근 시도) +* 웹 서버의 디렉터리 리스팅(directory listing)를 비활성화하고, 웹 루트(web root) 내에 파일 메타데이터(예: .git) 및 백업 파일이 존재하지 않도록 해야한다. +* 접근 제어 실패를 로깅하고 필요한 경우(예: 반복적인 실패 발생 시)에 관리자에게 알린다. * 자동화된 공격 도구로 인한 피해를 최소화하기 위해 API 및 컨트롤러 접근에 대한 속도 제한(Rate limit)을 구현한다. * 상태기반 세션 식별자는 로그아웃 후 무효화 한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격을 위한 기회를 최소화하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려하며, OAuth 표준에 따른 토큰 취소도 고려한다. * 간단하고 선언적 접근 제어를 제공하는 확립된 툴킷과 패턴을 사용한다. @@ -88,7 +88,7 @@ ## 공격 시나리오 예시. -**시나리오 1:** 이 기능은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다. +**시나리오 1:** 이 애플리케이션은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다. ``` @@ -136,7 +136,7 @@ $ curl https://example.com/app/admin_getappInfo * [OAuth: Revoking Access](https://www.oauth.com/oauth2-servers/listing-authorizations/revoking-access/) -## 해당되는 CWE. +## 해당되는 CWE 목록. * [CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')](https://cwe.mitre.org/data/definitions/22.html) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index d369424f1..c8825d6f2 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -109,7 +109,7 @@ * [Amazon S3 Bucket Discovery and Enumeration](https://blog.websecurify.com/2017/10/aws-s3-bucket-discovery.html) * ScienceDirect: Security Misconfiguration -## 해당되는 보안 약점(CWE). +## 해당되는 CWE 목록. * [CWE-5 J2EE Misconfiguration: Data Transmission Without Encryption](https://cwe.mitre.org/data/definitions/5.html) From 0d884d6f3e2dd09aed6753d4d7762c75d90f932e Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 20:03:46 +0900 Subject: [PATCH 078/167] Add A09 file into ko folder --- ...-Security_Logging_and_Alerting_Failures.md | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md new file mode 100644 index 000000000..630f0fb74 --- /dev/null +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -0,0 +1,136 @@ +# A09:2025 Security Logging & Alerting Failures ![icon](../assets/TOP_10_Icons_Final_Security_Logging_and_Monitoring_Failures.png){: style="height:80px;width:80px" align="right"} + + +## Background. + +Security Logging & Alerting Failures retains its position at #9. This category has a slight name change to emphasize the alerting function needed to induce action on relevant logging events. This category will always be underrepresented in the data, and for the third time voted into a position in the list from the community survey participants. This category is incredibly difficult to test for, and has minimal representation in the CVE/CVSS data (only 723 CVEs); but can be very impactful for visibility and incident alerting and forensics. This category includes issues with *properly handling output encoding to log files (CWE-117), inserting sensitive data into log files (CWE-532), and insufficient logging (CWE-778).* + + +## Score table. + + + + + + + + + + + + + + + + + + + + + + + + + +
CWEs Mapped + Max Incidence Rate + Avg Incidence Rate + Max Coverage + Avg Coverage + Avg Weighted Exploit + Avg Weighted Impact + Total Occurrences + Total CVEs +
5 + 11.33% + 3.91% + 85.96% + 46.48% + 7.19 + 2.65 + 260,288 + 723 +
+ + + +## Description. + +Without logging and monitoring, attacks and breaches cannot be detected, and without alerting it is very difficult to respond quickly and effectively during a security incident. Insufficient logging, continuous monitoring, detection, and alerting to initiate active responses occurs any time: + + +* Auditable events, such as logins, failed logins, and high-value transactions, are not logged or logged inconsistently (for instance, only logging successful logins, but not failed attempts). +* Warnings and errors generate no, inadequate, or unclear log messages. +* The integrity of logs is not properly protected from tampering. +* Logs of applications and APIs are not monitored for suspicious activity. +* Logs are only stored locally, and not properly backedup. +* Appropriate alerting thresholds and response escalation processes are not in place or effective. Alerts are not received or reviewed within a reasonable amount of time. +* Penetration testing and scans by dynamic application security testing (DAST) tools (such as Burp or ZAP) do not trigger alerts. +* The application cannot detect, escalate, or alert for active attacks in real-time or near real-time. +* You are vulnerable to sensitive information leakage by making logging and alerting events visible to a user or an attacker (see [A01:2025-Broken Access Control](A01_2025-Broken_Access_Control.md)), or by logging sensitive information that should not be logged (such as PII or PHI). +* You are vulnerable to injections or attacks on the logging or monitoring systems if log data is not correctly encoded. +* The application is missing or mishandling errors and other exceptional conditions, such that the system is unaware there was an error, and is therefore unable to log there was a problem. +* Adequate ‘use cases’ for issuing alerts are missing or outdated to recognize a special situation. +* Too many false positive alerts make it impossible to distinguish important alerts from unimportant ones, resulting in them being recognized too late or not at all (physical overload of the SOC team). +* Detected alerts cannot be processed correctly because the playbook for the use case is incomplete, out of date, or missing. + + +## How to prevent. + +Developers should implement some or all the following controls, depending on the risk of the application: + + +* Ensure all login, access control, and server-side input validation failures can be logged with sufficient user context to identify suspicious or malicious accounts and held for enough time to allow delayed forensic analysis. +* Ensure that every part of your app that contains a security control is logged, whether it succeeds or fails. +* Ensure that logs are generated in a format that log management solutions can easily consume. +* Ensure log data is encoded correctly to prevent injections or attacks on the logging or monitoring systems. +* Ensure all transactions have an audit trail with integrity controls to prevent tampering or deletion, such as append-only database tables or similar. +* Ensure all transactions that throw an error are rolled back and started over. Always fail closed. +* If your application or its users behave suspiciously, issue an alert. Create guidance for your developers on this topic so they can code against this or buy a system for this. +* DevSecOps and security teams should establish effective monitoring and alerting use cases including playbooks such that suspicious activities are detected and responded to quickly by the Security Operations Center (SOC) team. +* Add ‘honeytokens’ as traps for attackers into your application e.g. into the database, data, as real and/or technical user identity. As they are not used in normal business, any access generates logging data that can be alerted with nearly no false positives. +* Behavior analysis and AI support could be optionally an additional technique to support low rates of false positives for alerts. +* Establish or adopt an incident response and recovery plan, such as National Institute of Standards and Technology (NIST) 800-61r2 or later. Teach your software developers what application attacks and incidents look like, so they can report them. + +There are commercial and open-source application protection products such as the OWASP ModSecurity Core Rule Set, and open-source log correlation software, such as the Elasticsearch, Logstash, Kibana (ELK) stack, that feature custom dashboards and alerting that may help you combat these issues. There are also commercial observability tools that can help you respond to or block attacks in close to real-time. + + +## Example attack scenarios. + +**Scenario #1:** A children's health plan provider's website operator couldn't detect a breach due to a lack of monitoring and logging. An external party informed the health plan provider that an attacker had accessed and modified thousands of sensitive health records of more than 3.5 million children. A post-incident review found that the website developers had not addressed significant vulnerabilities. As there was no logging or monitoring of the system, the data breach could have been in progress since 2013, a period of more than seven years. + +**Scenario #2:** A major Indian airline had a data breach involving more than ten years' worth of personal data of millions of passengers, including passport and credit card data. The data breach occurred at a third-party cloud hosting provider, who notified the airline of the breach after some time. + +**Scenario #3:** A major European airline suffered a GDPR reportable breach. The breach was reportedly caused by payment application security vulnerabilities exploited by attackers, who harvested more than 400,000 customer payment records. The airline was fined 20 million pounds as a result by the privacy regulator. + + +## References. + +- [OWASP Proactive Controls: C9: Implement Logging and Monitoring](https://top10proactive.owasp.org/archive/2024/the-top-10/c9-security-logging-and-monitoring/) + +- [OWASP Application Security Verification Standard: V16 Security Logging and Error Handling](https://github.com/OWASP/ASVS/blob/v5.0.0/5.0/en/0x25-V16-Security-Logging-and-Error-Handling.md) + +- [OWASP Cheat Sheet: Application Logging Vocabulary](https://cheatsheetseries.owasp.org/cheatsheets/Application_Logging_Vocabulary_Cheat_Sheet.html) + +- [OWASP Cheat Sheet: Logging](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html) + +- [Data Integrity: Recovering from Ransomware and Other Destructive Events](https://csrc.nist.gov/publications/detail/sp/1800-11/final) + +- [Data Integrity: Identifying and Protecting Assets Against Ransomware and Other Destructive Events](https://csrc.nist.gov/publications/detail/sp/1800-25/final) + +- [Data Integrity: Detecting and Responding to Ransomware and Other Destructive Events](https://csrc.nist.gov/publications/detail/sp/1800-26/final) + +- [Real world example of such failures in Snowflake Breach](https://www.huntress.com/threat-library/data-breach/snowflake-data-breach) + + +## List of Mapped CWEs + +* [CWE-117 Improper Output Neutralization for Logs](https://cwe.mitre.org/data/definitions/117.html) + +* [CWE-221 Information Loss of Omission](https://cwe.mitre.org/data/definitions/221.html) + +* [CWE-223 Omission of Security-relevant Information](https://cwe.mitre.org/data/definitions/223.html) + +* [CWE-532 Insertion of Sensitive Information into Log File](https://cwe.mitre.org/data/definitions/532.html) + +* [CWE-778 Insufficient Logging](https://cwe.mitre.org/data/definitions/778.html) From 93e0db3559cfeb0fbc84a41c22c033eb6755fcc3 Mon Sep 17 00:00:00 2001 From: ni5am Date: Sun, 4 Jan 2026 22:59:10 +0900 Subject: [PATCH 079/167] Translate A09 document to Korean --- ...-Security_Logging_and_Alerting_Failures.md | 101 +++++++++--------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index 630f0fb74..d827936fc 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -1,33 +1,33 @@ -# A09:2025 Security Logging & Alerting Failures ![icon](../assets/TOP_10_Icons_Final_Security_Logging_and_Monitoring_Failures.png){: style="height:80px;width:80px" align="right"} +# A09:2025 보안 로깅 및 알림 실패 ![icon](../assets/TOP_10_Icons_Final_Security_Logging_and_Monitoring_Failures.png){: style="height:80px;width:80px" align="right"} -## Background. +## 배경. -Security Logging & Alerting Failures retains its position at #9. This category has a slight name change to emphasize the alerting function needed to induce action on relevant logging events. This category will always be underrepresented in the data, and for the third time voted into a position in the list from the community survey participants. This category is incredibly difficult to test for, and has minimal representation in the CVE/CVSS data (only 723 CVEs); but can be very impactful for visibility and incident alerting and forensics. This category includes issues with *properly handling output encoding to log files (CWE-117), inserting sensitive data into log files (CWE-532), and insufficient logging (CWE-778).* +보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식에 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *로그 기록 시 출력 인코딩 처리 미흡(CWE-117), 로그에 민감정보가 기록(CWE-532), 그리고 불충분한 로깅(CWE-778)이다.* -## Score table. +## 점수표. - - - - - - - - - @@ -54,57 +54,58 @@ Security Logging & Alerting Failures retains its position at #9. This category h -## Description. +## 설명. -Without logging and monitoring, attacks and breaches cannot be detected, and without alerting it is very difficult to respond quickly and effectively during a security incident. Insufficient logging, continuous monitoring, detection, and alerting to initiate active responses occurs any time: +로깅과 모니터링이 없으면 공격 및 침해를 탐지할 수 없으며, 알림이 없으면 보안 인시던트 발생시 신속하고 효과적으로 대응하기가 매우 어렵다. 다음과 같은 경우에는 불충분한 로깅, 지속적인 모니터링, 탐지 및 능동적 대응을 시작하기 위한 알림의 미흡이 발생한다. 아래와 같은 경우, 능동적 대응을 개시하기 위한 로깅, 지속적 모니터링, 탐지, 알림이 부족한 것으로 볼 수 있다. +* 로그인, 로그인 실패, 중요 거래 데이터 등 감사가 필요한 대상의 이벤트가 누락되거나 기준 없이 들쭉날쭉하게(예: 성공 로그인만 기록) 로깅되는 경우. +* 경고 및 오류가 로그 메시지를 생성하지 않거나, 부적절하거나, 불명확한 로그를 생성하는 경우. +* 로그가 위변조되지 않도록 무결성 보호가 적용되지 않는 경우. +* 애플리케이션 및 API 로그를 기반으로 한 이상징후 모니터링이 수행되지 않는 경우. +* 로그가 로컬에만 보관되고 백업이 적절히 수행되지 않는 경우. +* 적절한 알림 임계값 및 대응 에스컬레이션 절차가 마련되어 있지 않거나 효과적이지 않다. 알림이 적시에 확인되지 않거나 검토되지 않는 경우. +* 동적 애플리케이션 보안 테스트(DAST) 도구(예: Burp 또는 ZAP)에 의한 침투 테스트 및 스캔이 알림을 트리거하지 않는 경우. +* 진행 중인 공격을 실시간 혹은 준실시간으로 탐지하지 못하거나 상위 단계로 에스컬레이션하거나 알림을 발생시키지 못하는 경우. +* 로깅 및 알림 이벤트를 사용자 또는 공격자에게 노출 하거나([A01:2025-접근 제어 실패](A01_2025-Broken_Access_Control.md) 참조), 로깅되면 안 되는 민감정보(예: PII 또는 PHI)를 로깅함으로써 민감정보 유출에 취약한 경우. +* 로그 데이터 인코딩이 부적절해 로깅 또는 모니터링 시스템 자체가 인젝션 등 공격 대상이 되는 경우. +* 애플리케이션이 오류 및 예외 처리를 누락 또는 오처리하여 시스템이 오류 발생 자체를 인지하지 못하고, 결과적으로 문제를 로그로 남길 수 없는 경우. +* 특수 상황을 식별하기 위한 알림 '유스케이스'가 없거나 오래되어 현재 환경을 반영하지 못한다. +* 특정 상황을 탐지해 알림을 발생시키기 위한 인시던트 유스케이스(use case)가 없거나, 갱신이 되지 않아 현행 환경을 충분히 반영하지 못하는 경우. +* 너무 많은 오탐 알림으로 인해 중요한 알림과 중요하지 않은 알림을 구분할 수 없게 되어, 알림이 너무 늦게 인지되거나 전혀 인지되지 않는 경우(SOC 팀의 물리적 과부하). +* 유스케이스에 대한 플레이북이 불완전하거나, 최신이 아니거나, 누락되어 감지된 알림을 올바르게 처리할 수 없는 경우. -* Auditable events, such as logins, failed logins, and high-value transactions, are not logged or logged inconsistently (for instance, only logging successful logins, but not failed attempts). -* Warnings and errors generate no, inadequate, or unclear log messages. -* The integrity of logs is not properly protected from tampering. -* Logs of applications and APIs are not monitored for suspicious activity. -* Logs are only stored locally, and not properly backedup. -* Appropriate alerting thresholds and response escalation processes are not in place or effective. Alerts are not received or reviewed within a reasonable amount of time. -* Penetration testing and scans by dynamic application security testing (DAST) tools (such as Burp or ZAP) do not trigger alerts. -* The application cannot detect, escalate, or alert for active attacks in real-time or near real-time. -* You are vulnerable to sensitive information leakage by making logging and alerting events visible to a user or an attacker (see [A01:2025-Broken Access Control](A01_2025-Broken_Access_Control.md)), or by logging sensitive information that should not be logged (such as PII or PHI). -* You are vulnerable to injections or attacks on the logging or monitoring systems if log data is not correctly encoded. -* The application is missing or mishandling errors and other exceptional conditions, such that the system is unaware there was an error, and is therefore unable to log there was a problem. -* Adequate ‘use cases’ for issuing alerts are missing or outdated to recognize a special situation. -* Too many false positive alerts make it impossible to distinguish important alerts from unimportant ones, resulting in them being recognized too late or not at all (physical overload of the SOC team). -* Detected alerts cannot be processed correctly because the playbook for the use case is incomplete, out of date, or missing. +## 대응 방안. -## How to prevent. +개발자는 애플리케이션의 위험도에 따라 아래 통제 항목 중 일부 또는 전체를 구현해야 한다. -Developers should implement some or all the following controls, depending on the risk of the application: +* 모든 로그인, 접근 통제 및 서버 측 입력 검증 실패에 대해 로그를 남기며, 의심스럽거나 악성인 계정을 식별할 수 있을 만큼 충분한 유저 컨텍스트를 포함하고, 사후 포렌식 분석을 위해 충분한 기간 동안 저장한다. +* 보안 통제가 포함된 애플리케이션의 모든 부분에서, 성공 여부와 관계없이 로깅되도록 보장한다. +* 보안 통제가 적용된 구간은 성공 및 실패 여부와 무관하게 모두 로깅 대상에 포함한다. +* 로그는 중앙 로그 플랫폼이 쉽게 수집할 수 있는 표준화된 포맷으로 생성한다. +* 로그 데이터는 인코딩을 확실히 적용해 로깅 및 모니터링 시스템의 로그 기반 인젝션 및 공격을 예방한다. +* 모든 트랜잭션에 대해 감사 로그를 남기고, 추가만 가능한(append-only) 데이터베이스 테이블 등으로 삭제 및 변조를 어렵게 하는 무결성 통제를 적용한다. +* 오류가 발생한 모든 트랜잭션은 롤백되고 다시 시작되도록 한다. 또한, 기본적으로 차단(fail closed)되도록 한다. +* 애플리케이션 또는 사용자 행위가 의심스러운 경우 알림을 발행한다. 개발자가 해당 내용을 대응하여 코드를 개발할 수 있도록 가이드를 제공하거나, 이를 위한 시스템을 구매한다. +* DevSecOps 및 보안 팀은 SOC(Security Operations Center) 팀이 의심 활동을 신속히 탐지하고 대응할 수 있도록, 플레이북을 포함한 효과적인 모니터링 및 알림 유스케이스를 수립해야 한다. +* 공격자를 위한 함정으로 '허니토큰(honeytoken)'을 애플리케이션에 추가한다. 예를 들어 데이터베이스 내에 실제 사용자 및/또는 시스템 계정 형태의 데이터 또는 식별자를 삽입한다. 허니토큰은 정상 업무에서는 사용되지 않으므로, 접근이 발생하면 관련 이벤트가 로그로 남고 오탐이 거의 없는 알림 조건으로 활용할 수 있다. +* 필요 시 행위 기반 분석 및 AI를 보조 수단으로 활용해 오탐을 낮추고 알림 품질을 개선한다. +* NIST 800-61r2 이상 수준의 인시던트 대응 및 복구 계획을 마련하고, 개발자에게 공격/인시던트 징후를 교육해 보고 및 초기 대응이 가능하도록 한다. -* Ensure all login, access control, and server-side input validation failures can be logged with sufficient user context to identify suspicious or malicious accounts and held for enough time to allow delayed forensic analysis. -* Ensure that every part of your app that contains a security control is logged, whether it succeeds or fails. -* Ensure that logs are generated in a format that log management solutions can easily consume. -* Ensure log data is encoded correctly to prevent injections or attacks on the logging or monitoring systems. -* Ensure all transactions have an audit trail with integrity controls to prevent tampering or deletion, such as append-only database tables or similar. -* Ensure all transactions that throw an error are rolled back and started over. Always fail closed. -* If your application or its users behave suspiciously, issue an alert. Create guidance for your developers on this topic so they can code against this or buy a system for this. -* DevSecOps and security teams should establish effective monitoring and alerting use cases including playbooks such that suspicious activities are detected and responded to quickly by the Security Operations Center (SOC) team. -* Add ‘honeytokens’ as traps for attackers into your application e.g. into the database, data, as real and/or technical user identity. As they are not used in normal business, any access generates logging data that can be alerted with nearly no false positives. -* Behavior analysis and AI support could be optionally an additional technique to support low rates of false positives for alerts. -* Establish or adopt an incident response and recovery plan, such as National Institute of Standards and Technology (NIST) 800-61r2 or later. Teach your software developers what application attacks and incidents look like, so they can report them. +추가로, OWASP ModSecurity 핵심 규칙 세트(Core Rule Set)와 같은 상용 및 오픈소스 애플리케이션 보호 제품, 그리고 사용자 정의 대시보드 및 알림 기능을 제공하여 대응에 도움이 될 수 있는 Elasticsearch, Logstash, Kibana(ELK) 스택과 같은 오픈소스 로그 상관분석 소프트웨어가 있다. 공격에 준실시간으로 대응하거나 이를 차단하는 데 도움이 되는 상용 옵저버빌리티(observability) 도구도 존재한다. -There are commercial and open-source application protection products such as the OWASP ModSecurity Core Rule Set, and open-source log correlation software, such as the Elasticsearch, Logstash, Kibana (ELK) stack, that feature custom dashboards and alerting that may help you combat these issues. There are also commercial observability tools that can help you respond to or block attacks in close to real-time. +## 공격 시나리오 예시. -## Example attack scenarios. +**시나리오 1:** 한 아동 건강보험 제공업체의 웹사이트 운영자는 모니터링 및 로깅 부재로 인해 침해 사고를 탐지하지 못했다. 외부 제3자가 해당 제공업체에 공격자가 350만 명이 넘는 아동의 민감한 건강 기록 수천 건에 접근하여 이를 수정했다고 통보했다. 사후 분석에서는 핵심 취약점이 장기간 방치된 정황이 확인되었으며, 로그와 모니터링이 없어 침해가 2013년부터 7년 이상 지속되었을 가능성도 배제할 수 없었다. -**Scenario #1:** A children's health plan provider's website operator couldn't detect a breach due to a lack of monitoring and logging. An external party informed the health plan provider that an attacker had accessed and modified thousands of sensitive health records of more than 3.5 million children. A post-incident review found that the website developers had not addressed significant vulnerabilities. As there was no logging or monitoring of the system, the data breach could have been in progress since 2013, a period of more than seven years. +**시나리오 2:** 인도의 주요 항공사에서 여권 및 신용카드 데이터를 포함해 수백만 명 승객의 10년 이상 분량 개인정보가 관련된 데이터 유출이 발생했다. 해당 유출은 제3자 클라우드 호스팅 제공업체에서 발생했으며, 해당 제공업체는 일정 시간이 지난 뒤 항공사에 침해 사실을 통보했다. -**Scenario #2:** A major Indian airline had a data breach involving more than ten years' worth of personal data of millions of passengers, including passport and credit card data. The data breach occurred at a third-party cloud hosting provider, who notified the airline of the breach after some time. +**사나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취했다. 그 결과 항공사는 개인정보 감독기관으로부터 2,000만 파운드의 벌금을 부과받았다. -**Scenario #3:** A major European airline suffered a GDPR reportable breach. The breach was reportedly caused by payment application security vulnerabilities exploited by attackers, who harvested more than 400,000 customer payment records. The airline was fined 20 million pounds as a result by the privacy regulator. - -## References. +## 참조. - [OWASP Proactive Controls: C9: Implement Logging and Monitoring](https://top10proactive.owasp.org/archive/2024/the-top-10/c9-security-logging-and-monitoring/) @@ -123,7 +124,7 @@ There are commercial and open-source application protection products such as the - [Real world example of such failures in Snowflake Breach](https://www.huntress.com/threat-library/data-breach/snowflake-data-breach) -## List of Mapped CWEs +## 해당되는 CWE 목록. * [CWE-117 Improper Output Neutralization for Logs](https://cwe.mitre.org/data/definitions/117.html) From dfa32fa7927ee0c0ccf8ba0a543a52cc9869e024 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Sun, 4 Jan 2026 23:48:04 +0900 Subject: [PATCH 080/167] =?UTF-8?q?=EC=88=98=EC=A0=95=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 피드백 반영 완료하였습니다 --- ...2025-Software_or_Data_Integrity_Failures.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index b7b85bc1f..12a9d969d 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -2,7 +2,7 @@ ## 배경. -소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 및 데이터 무결성 실패"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 해당 카테고리는 소프트웨어 공급망 실패(Software Supply Chain Failures)보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 CWE로는 CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함(Inclusion of Functionality from Untrusted Control Sphere), CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정(Improperly Controlled Modification of Dynamically-Determined Object Attributes), CWE-502: 신뢰할 수 없는 데이터의 역직렬화(Deserialization of Untrusted Data)가 있다. +소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 *및* 데이터 무결성 실패"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 해당 카테고리는 소프트웨어 공급망 실패(Software Supply Chain Failures)보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 CWE로는 *CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함(Inclusion of Functionality from Untrusted Control Sphere)*, *CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정(Improperly Controlled Modification of Dynamically-Determined Object Attributes)*, *CWE-502: 신뢰할 수 없는 데이터의 역직렬화(Deserialization of Untrusted Data)*가 있다. ## 점수 표. @@ -55,28 +55,28 @@ ## 설명. -소프트웨어 및 데이터 무결성 실패는 유효하지 않거나 신뢰할 수 없는 코드 또는 데이터가 신뢰할 수 있고 유효한 것으로 취급되는 것을 방지하지 못하는 코드 및 인프라와 관련된다. 예를 들어, 애플리케이션이 신뢰할 수 없는 출처, 저장소, 콘텐츠 전송 네트워크(CDN)에서 제공되는 플러그인, 라이브러리, 모듈에 의존하는 경우가 이에 해당한다. 소프트웨어 무결성 검증을 수행하지 않거나(원:소비하지 않거나) 제공하지 않는 불안전한 CI/CD 파이프라인은 비인가 접근, 불안전하거나 악성인 코드, 또는 시스템 손상으로 이어질 잠재적 위험을 초래할 수 있다. 또 다른 예로, CI/CD가 신뢰할 수 없는 위치에서 코드나 아티팩트를 가져오고, 사용 전에 서명 확인 등 유사한 메커니즘으로 이를 검증하지 않는 경우가 있다. 마지막으로, 많은 애플리케이션에는 자동 업데이트 기능이 포함되어 있는데, 업데이트가 충분한 무결성 검증 없이 다운로드되어 이전에 신뢰하던 애플리케이션에 적용될 수 있다. 공격자는 자신의 업데이트를 업로드하여 모든 설치본에 배포 및 실행되도록 만들 수도 있다. 또 다른 예로, 객체나 데이터가 공격자가 보고 수정할 수 있는 구조로 인코딩되거나 직렬화되는 경우, 불안전한 역직렬화(insecure deserialization)에 취약해질 수 있다. +소프트웨어 및 데이터 무결성 실패는 유효하지 않거나 신뢰할 수 없는 코드 또는 데이터가 신뢰할 수 있고 유효한 것으로 취급되는 것을 방지하지 못하는 코드 및 인프라와 관련된다. 예를 들어, 애플리케이션이 신뢰할 수 없는 출처, 저장소, 콘텐츠 전송 네트워크(CDN)에서 제공되는 플러그인, 라이브러리, 모듈에 의존하는 경우가 이에 해당한다. 소프트웨어 무결성 검증을 수행하지 않거나 제공하지 않는 불안전한 CI/CD 파이프라인은 비인가 접근, 불안전하거나 악의적인 코드, 또는 시스템 손상으로 이어질 잠재적 위험을 초래할 수 있다. 또 다른 예로, CI/CD가 신뢰할 수 없는 장소에서 코드나 아티팩트를 가져오고, 사용 전에 서명 확인 등 유사한 메커니즘으로 이를 검증하지 않는 경우가 있다. 마지막으로, 많은 애플리케이션에는 자동 업데이트 기능이 포함되어 있는데, 업데이트가 충분한 무결성 검증 없이 다운로드되어 기존에 신뢰하던 애플리케이션에 그대로 적용되는 경우가 있다. 이런 구조에서는 공격자가 자신의 업데이트를 업로드해 이를 모든 설치본에 배포, 실행되도록 만들 수 있다. 또 다른 예로, 객체나 데이터가 공격자가 확인하고 수정할 수 있는 형태로 인코딩되거나 직렬화된 경우, 불안전한 역직렬화(insecure deserialization)에 취약해질 수 있다. ## 예방 방법. * 디지털 서명 또는 유사한 메커니즘을 사용하여 소프트웨어나 데이터가 예상된 출처에서 왔고 변조되지 않았음을 검증한다. -* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 저장소만 사용하도록 보장한다. 위험 수준이 더 높다면, 검증된 내부 저장소를 호스팅하는 방안을 고려한다. -* 악성 코드 또는 설정이 소프트웨어 파이프라인에 유입될 가능성을 최소화하기 위해, 코드 및 구성 변경에 대한 검토 절차를 마련한다. -* 빌드 및 배포 과정에서 흐르는 코드의 무결성을 보장할 수 있도록, CI/CD 파이프라인에 적절한 분리(격리), 구성, 접근 통제를 적용한다. +* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 저장소만 사용하도록 보장한다. 위험 수준이 더 높다면, 잘 검증된 내부 저장소를 호스팅하는 방안을 고려한다. +* 악의적인 목적의 코드 또는 설정이 소프트웨어 파이프라인에 유입될 가능성을 최소화하기 위해, 코드 및 설정 변경에 대한 검토 절차를 마련한다. +* 빌드 및 배포 과정에서 흐르는 코드의 무결성을 보장할 수 있도록, CI/CD 파이프라인에 적절한 분리(격리), 구성, 접근 제어를 적용한다. * 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 수신된 뒤, 변조 또는 재전송(replay)을 탐지하기 위한 무결성 검사나 디지털 서명 없이 사용되지 않도록 보장한다. ## 공격 시나리오 예시. -**시나리오 #1 신뢰할 수 없는 출처로부터의 웹 기능 포함:** 한 회사가 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 지원 제공업체로 전송된다. 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. +**시나리오 #1 신뢰할 수 없는 외부 웹 기능 연동:** 한 회사가 고객 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 고객 지원 제공업체로 전송된다. 고객 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. -**시나리오 #2 서명 없이 업데이트:** 많은 가정용 라우터, 셋톱박스, 장치 펌웨어 등은 서명된 펌웨어를 통해 업데이트를 검증하지 않는다. 서명되지 않은 펌웨어는 공격자에게 점점 더 매력적인 표적이 되고 있으며, 앞으로도 악화될 것으로 예상된다. 이는 대개 향후 버전에서 수정한 뒤 이전 버전이 자연스럽게 도태될 때까지 기다리는 것 외에는 별도의 개선(리미디에이션) 메커니즘이 없는 경우가 많다는 점에서 큰 우려 사항이다. +**시나리오 #2 서명 없이 업데이트:** 많은 가정용 라우터, 셋톱박스, 장치 펌웨어 등은 업데이트를 위해 서명된 펌웨어를 사용하지 않는다. 서명되지 않은 펌웨어는 공격자에게 점점 더 매력적인 표적이 되고 있으며, 앞으로도 악화될 것으로 예상된다. 이는 대개 향후 버전에서 수정한 뒤 이전 버전이 자연스럽게 사라질 때까지 기다려야 수밖에 없는 경우가 많다는 점에서 큰 우려 사항이다. -**시나리오 #3 신뢰할 수 없는 출처의 패키지 사용:** 한 개발자가 찾고 있는 패키지의 최신 버전을 구하기 어렵자, 일반적으로 사용하는 신뢰할 수 있는 패키지 관리자가 아니라 온라인 웹사이트에서 패키지를 다운로드한다. 해당 패키지는 서명되어 있지 않으므로 무결성을 보장할 방법이 없다. 해당 패키지에는 악성 코드가 포함되어 있다. +**시나리오 #3 신뢰할 수 없는 출처의 패키지 사용:** 한 개발자가 찾고 있는 패키지의 최신 버전을 구하기 어렵자, 일반적으로 사용하는 신뢰할 수 있는 패키지 관리자가 아니라 온라인 웹사이트에서 패키지를 다운로드한다. 해당 패키지는 서명되어 있지 않으므로 무결성을 보장할 방법이 없다. 해당 패키지에는 악의적인 코드가 포함되어 있다. -**시나리오 #4 불안전한 역직렬화(Insecure Deserialization):** 한 React 애플리케이션이 Spring Boot 마이크로서비스 집합을 호출한다. 함수형 프로그래밍을 지향하던 이들은 코드의 불변성(immutability)을 보장하려고 했다. 그들이 선택한 해결책은 사용자 상태를 직렬화(serialization)하여 각 요청마다 이를 주고받는 것이었다. 공격자는 (base64로 인코딩된) "rO0" 자바 객체 시그니처를 발견하고, [Java Deserialization Scanner](https://github.com/federicodotta/Java-Deserialization-Scanner)를 사용해 애플리케이션 서버에서 원격 코드 실행(RCE)을 획득한다. +**시나리오 #4 불안전한 역직렬화:** 한 React 애플리케이션이 여러 Spring Boot 마이크로서비스를 호출한다. 함수형 프로그래밍을 지향하던 이들은 코드의 불변성을 보장하려고 했다. 그들이 선택한 해결책은 사용자 상태를 직렬화하여 각 요청마다 이를 주고받는 것이었다. 공격자는 (base64로 인코딩된) "rO0" 자바 객체 시그니처를 발견하고, [Java Deserialization Scanner](https://github.com/federicodotta/Java-Deserialization-Scanner)를 사용해 애플리케이션 서버에서 원격 코드 실행(RCE)을 획득한다. ## 참조. From 810fbd8674a220bb9e31fe48180e28b5121b217b Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Sun, 4 Jan 2026 23:51:03 +0900 Subject: [PATCH 081/167] =?UTF-8?q?=EC=B0=B8=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...025-Software_or_Data_Integrity_Failures.md | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index 12a9d969d..7e944d019 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -80,42 +80,42 @@ ## 참조. -* [OWASP 치트 시트: 소프트웨어 공급망 보안](https://cheatsheetseries.owasp.org/cheatsheets/Software_Supply_Chain_Security_Cheat_Sheet.html) -* [OWASP 치트 시트: 코드형 인프라(Infrastructure as Code)](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) -* [OWASP 치트 시트: 역직렬화(Deserialization)](https://wiki.owasp.org/index.php/Deserialization_Cheat_Sheet) -* [SAFECode 소프트웨어 무결성 통제(Software Integrity Controls)](https://safecode.org/publication/SAFECode_Software_Integrity_Controls0610.pdf) -* [‘최악의 악몽’ 사이버 공격: SolarWinds 해킹의 알려지지 않은 이야기](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) -* [CodeCov Bash Uploader 침해 사고](https://about.codecov.io/security-update) -* [Julien Vehent의 『Securing DevOps』](https://www.manning.com/books/securing-devops) -* [Tenendo: 불안전한 역직렬화(Insecure Deserialization)](https://tenendo.com/insecure-deserialization/) +* [OWASP Cheat Sheet: Software Supply Chain Security](https://cheatsheetseries.owasp.org/cheatsheets/Software_Supply_Chain_Security_Cheat_Sheet.html) +* [OWASP Cheat Sheet: Infrastructure as Code](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) +* [OWASP Cheat Sheet: Deserialization](https://wiki.owasp.org/index.php/Deserialization_Cheat_Sheet) +* [SAFECode Software Integrity Controls](https://safecode.org/publication/SAFECode_Software_Integrity_Controls0610.pdf) +* [A 'Worst Nightmare' Cyberattack: The Untold Story Of The SolarWinds Hack](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) +* [CodeCov Bash Uploader Compromise](https://about.codecov.io/security-update) +* [Securing DevOps by Julien Vehent](https://www.manning.com/books/securing-devops) +* [Insecure Deserialization by Tenendo](https://tenendo.com/insecure-deserialization/) ## 매핑된 CWE 목록 -* [CWE-345 데이터 진정성에 대한 불충분한 검증(Insufficient Verification of Data Authenticity)](https://cwe.mitre.org/data/definitions/345.html) +* [CWE-345 Insufficient Verification of Data Authenticity](https://cwe.mitre.org/data/definitions/345.html) -* [CWE-353 무결성 검사 지원 누락(Missing Support for Integrity Check)](https://cwe.mitre.org/data/definitions/353.html) +* [CWE-353 Missing Support for Integrity Check](https://cwe.mitre.org/data/definitions/353.html) -* [CWE-426 신뢰할 수 없는 검색 경로(Untrusted Search Path)](https://cwe.mitre.org/data/definitions/426.html) +* [CWE-426 Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html) -* [CWE-427 통제되지 않은 검색 경로 요소(Uncontrolled Search Path Element)](https://cwe.mitre.org/data/definitions/427.html) +* [CWE-427 Uncontrolled Search Path Element](https://cwe.mitre.org/data/definitions/427.html) -* [CWE-494 무결성 검사 없이 코드 다운로드(Download of Code Without Integrity Check)](https://cwe.mitre.org/data/definitions/494.html) +* [CWE-494 Download of Code Without Integrity Check](https://cwe.mitre.org/data/definitions/494.html) -* [CWE-502 신뢰할 수 없는 데이터의 역직렬화(Deserialization of Untrusted Data)](https://cwe.mitre.org/data/definitions/502.html) +* [CWE-502 Deserialization of Untrusted Data](https://cwe.mitre.org/data/definitions/502.html) -* [CWE-506 악성 코드 내장(Embedded Malicious Code)](https://cwe.mitre.org/data/definitions/506.html) +* [CWE-506 Embedded Malicious Code](https://cwe.mitre.org/data/definitions/506.html) -* [CWE-509 악성 코드 복제(바이러스 또는 웜)(Replicating Malicious Code (Virus or Worm))](https://cwe.mitre.org/data/definitions/509.html) +* [CWE-509 Replicating Malicious Code (Virus or Worm)](https://cwe.mitre.org/data/definitions/509.html) -* [CWE-565 검증 및 무결성 검사 없이 쿠키에 의존(Reliance on Cookies without Validation and Integrity Checking)](https://cwe.mitre.org/data/definitions/565.html) +* [CWE-565 Reliance on Cookies without Validation and Integrity Checking](https://cwe.mitre.org/data/definitions/565.html) -* [CWE-784 보안 의사결정에서 검증 및 무결성 검사 없이 쿠키에 의존(Reliance on Cookies without Validation and Integrity Checking in a Security Decision)](https://cwe.mitre.org/data/definitions/784.html) +* [CWE-784 Reliance on Cookies without Validation and Integrity Checking in a Security Decision](https://cwe.mitre.org/data/definitions/784.html) -* [CWE-829 신뢰할 수 없는 통제 영역(Control Sphere)에서 기능 포함(Inclusion of Functionality from Untrusted Control Sphere)](https://cwe.mitre.org/data/definitions/829.html) +* [CWE-829 Inclusion of Functionality from Untrusted Control Sphere](https://cwe.mitre.org/data/definitions/829.html) -* [CWE-830 신뢰할 수 없는 출처로부터의 웹 기능 포함(Inclusion of Web Functionality from an Untrusted Source)](https://cwe.mitre.org/data/definitions/830.html) +* [CWE-830 Inclusion of Web Functionality from an Untrusted Source](https://cwe.mitre.org/data/definitions/830.html) -* [CWE-915 동적으로 결정되는 객체 속성의 부적절하게 통제된 수정(Improperly Controlled Modification of Dynamically-Determined Object Attributes)](https://cwe.mitre.org/data/definitions/915.html) +* [CWE-915 Improperly Controlled Modification of Dynamically-Determined Object Attributes](https://cwe.mitre.org/data/definitions/915.html) -* [CWE-926 Android 애플리케이션 컴포넌트의 부적절한 내보내기(Improper Export of Android Application Components)](https://cwe.mitre.org/data/definitions/926.html) +* [CWE-926 Improper Export of Android Application Components](https://cwe.mitre.org/data/definitions/926.html) From 5e6c704ea00c23ff94b6687fbe49abe3452c90f0 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Sun, 4 Jan 2026 23:57:47 +0900 Subject: [PATCH 082/167] Copy X01_2025-Next_Steps.md --- 2025/docs/ko/X01_2025-Next_Steps.md | 324 ++++++++++++++++++++++++++++ 1 file changed, 324 insertions(+) create mode 100644 2025/docs/ko/X01_2025-Next_Steps.md diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md new file mode 100644 index 000000000..49d350e68 --- /dev/null +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -0,0 +1,324 @@ +# Next Steps + +By design, the OWASP Top 10 is innately limited to the ten most significant risks. Every OWASP Top 10 has “on the cusp” risks considered at length for inclusion, but in the end, didn't make the cut. The other risks were more prevalent and impactful. + +The following two issues are well worth the effort to identify and remediate, organizations working towards a mature appsec program, security consultancies, or tool vendors wishing to expand coverage for their offerings. + + +## X01:2025 Lack of Application Resilience + +### Background. + +This is a renaming of 2021’s Denial of Service. That was renamed as it described a symptom rather than a root cause. This category focuses on CWEs that describe weaknesses that are related to resilience issues. The scoring of this category was very close with A10:2025-Mishandling of Exceptional Conditions. Relevant CWEs include: *CWE-400 Uncontrolled Resource Consumption, CWE-409 Improper Handling of Highly Compressed Data (Data Amplification), CWE-674 Uncontrolled Recursion*, and *CWE-835 Loop with Unreachable Exit Condition ('Infinite Loop').* + + +### Score table. + + +
CWEs Mapped + 해당되는 CWE 개수 Max Incidence Rate + 최대 취약점 발생률 Avg Incidence Rate + 평균 취약점 발생률 Max Coverage + 최대 테스트 커버리지 Avg Coverage + 평균 테스트 커버리지 Avg Weighted Exploit + 평균 가중 악용도 Avg Weighted Impact + 평균 가중 영향도 Total Occurrences + 총 발생 건수 Total CVEs + 총 CVE 건수
+ + + + + + + + + + + + + + + + + + + + + + +
CWEs Mapped + Max Incidence Rate + Avg Incidence Rate + Max Coverage + Avg Coverage + Avg Weighted Exploit + Avg Weighted Impact + Total Occurrences + Total CVEs +
16 + 20.05% + 4.55% + 86.01% + 41.47% + 7.92 + 3.49 + 865,066 + 4,423 +
+ + + +### Description. + +This category represents a systemic weakness in how applications respond to stress, failures, and edge cases that it is unable to recover from failure. When an application does not gracefully handle, withstand, or recover from unexpected conditions, resource constraints, and other adverse events it can easily result in availability issues (most commonly), but also data corruption, sensitive data disclosure, cascading failures, and/or bypasses of security controls. + +Furthermore [X02:2025 Memory Management Failures](#x022025-memory-management-failures) can also lead to failure of the application or even the entire system. + +### How to prevent + +In order to prevent this type of vulnerability you must design for failure and recovery of your systems. + +* Add limits, quotas, and failover functionality, paying special attention to the most resource consuming operations +* Identify resource intensive pages and plan ahead: Reduce attack surface especially not exposing unneeded ‘gadgets’ and functions that require a lot of resources (e.g. CPU, memory) to unknown or untrusted users +* Perform strict input validation with allow-lists and size limitations, then test thoroughly +* Limit response sizes, and never send raw responses back to the client (process on the server side) +* Default to safe/closed (never open), deny by default and roll back if there’s an error +* Avoid blocking synchronous calls in request threads (use asynchronous/non-blocking, have timeouts, have concurrency limits, etc.) +* Carefully test your error handling functionality +* Implement resilience patterns such as circuit breakers, bulkheads, retry logic, and graceful degradation +* Do performance and load testing; add chaos engineering if you have the risk appetite for it +* Implement and architect for redundancy where reasonable and affordable +* Implement monitoring, observability, and alerting +* Filter invalid sender addresses in accordance with RFC 2267 +* Block known botnets by finger prints, IPs, or dynamically by behavior +* Proof-of-Work: initiate resource consuming operations at the *attackers* side that does not have big impacts on normal users but impacts bots trying to send a huge amount of requests. Make the Proof-of-Work more difficult if the general load of the system raises, especially for systems that are less trustworthy or appear to be bots +* Limit server side session time based on inactivity and a final timeout +* Limit session bound information storage + + +### Example attack scenarios. + +**Scenario #1:** Attackers intentionally consume application resources to trigger failures within the system, resulting in denial of service. This could be memory exhaustion, filling up disk space, CPU saturation, or opening endless connections. + +**Scenario #2:** Input fuzzing that leads to crafted responses that break application business logic. + +**Scenario #3:** Attackers focus on the application’s dependencies, taking down APIs or other external services, and the application is unable to continue. + + +### References. + +* [OWASP Cheat Sheet: Denial of Service](https://cheatsheetseries.owasp.org/cheatsheets/Denial_of_Service_Cheat_Sheet.html) +* [OWASP MASVS‑RESILIENCE](https://mas.owasp.org/MASVS/11-MASVS-RESILIENCE/) +* [ASP.NET Core Best Practices (Microsoft)](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/best-practices?view=aspnetcore-9.0) +* [Resilience in Microservices: Bulkhead vs Circuit Breaker (Parser)](https://medium.com/@parserdigital/resilience-in-microservices-bulkhead-vs-circuit-breaker-54364c1f9d53) +* [Bulkhead Pattern (Geeks for Geeks)](https://www.geeksforgeeks.org/system-design/bulkhead-pattern/) +* [NIST Cybersecurity Framework (CSF)](https://www.nist.gov/cyberframework) +* [Avoid Blocking Calls: Go Async in Java (Devlane)](https://www.devlane.com/blog/avoid-blocking-calls-go-async-in-java) + +### List of Mapped CWEs +* [CWE-73 External Control of File Name or Path](https://cwe.mitre.org/data/definitions/73.html) +* [CWE-183 Permissive List of Allowed Inputs](https://cwe.mitre.org/data/definitions/183.html) +* [CWE-256 Plaintext Storage of a Password](https://cwe.mitre.org/data/definitions/256.html) +* [CWE-266 Incorrect Privilege Assignment](https://cwe.mitre.org/data/definitions/266.html) +* [CWE-269 Improper Privilege Management](https://cwe.mitre.org/data/definitions/269.html) +* [CWE-286 Incorrect User Management](https://cwe.mitre.org/data/definitions/286.html) +* [CWE-311 Missing Encryption of Sensitive Data](https://cwe.mitre.org/data/definitions/311.html) +* [CWE-312 Cleartext Storage of Sensitive Information](https://cwe.mitre.org/data/definitions/312.html) +* [CWE-313 Cleartext Storage in a File or on Disk](https://cwe.mitre.org/data/definitions/313.html) +* [CWE-316 Cleartext Storage of Sensitive Information in Memory](https://cwe.mitre.org/data/definitions/316.html) +* [CWE-362 Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')](https://cwe.mitre.org/data/definitions/362.html) +* [CWE-382 J2EE Bad Practices: Use of System.exit()](https://cwe.mitre.org/data/definitions/382.html) +* [CWE-419 Unprotected Primary Channel](https://cwe.mitre.org/data/definitions/419.html) +* [CWE-434 Unrestricted Upload of File with Dangerous Type](https://cwe.mitre.org/data/definitions/434.html) +* [CWE-436 Interpretation Conflict](https://cwe.mitre.org/data/definitions/436.html) +* [CWE-444 Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling')](https://cwe.mitre.org/data/definitions/444.html) +* [CWE-451 User Interface (UI) Misrepresentation of Critical Information](https://cwe.mitre.org/data/definitions/451.html) +* [CWE-454 External Initialization of Trusted Variables or Data Stores](https://cwe.mitre.org/data/definitions/454.html) +* [CWE-472 External Control of Assumed-Immutable Web Parameter](https://cwe.mitre.org/data/definitions/472.html) +* [CWE-501 Trust Boundary Violation](https://cwe.mitre.org/data/definitions/501.html) +* [CWE-522 Insufficiently Protected Credentials](https://cwe.mitre.org/data/definitions/522.html) +* [CWE-525 Use of Web Browser Cache Containing Sensitive Information](https://cwe.mitre.org/data/definitions/525.html) +* [CWE-539 Use of Persistent Cookies Containing Sensitive Information](https://cwe.mitre.org/data/definitions/539.html) +* [CWE-598 Use of GET Request Method With Sensitive Query Strings](https://cwe.mitre.org/data/definitions/598.html) +* [CWE-602 Client-Side Enforcement of Server-Side Security](https://cwe.mitre.org/data/definitions/602.html) +* [CWE-628 Function Call with Incorrectly Specified Arguments](https://cwe.mitre.org/data/definitions/628.html) +* [CWE-642 External Control of Critical State Data](https://cwe.mitre.org/data/definitions/642.html) +* [CWE-646 Reliance on File Name or Extension of Externally-Supplied File](https://cwe.mitre.org/data/definitions/646.html) +* [CWE-653 Improper Isolation or Compartmentalization](https://cwe.mitre.org/data/definitions/653.html) +* [CWE-656 Reliance on Security Through Obscurity](https://cwe.mitre.org/data/definitions/656.html) +* [CWE-657 Violation of Secure Design Principles](https://cwe.mitre.org/data/definitions/657.html) +* [CWE-676 Use of Potentially Dangerous Function](https://cwe.mitre.org/data/definitions/676.html) +* [CWE-693 Protection Mechanism Failure](https://cwe.mitre.org/data/definitions/693.html) +* [CWE-799 Improper Control of Interaction Frequency](https://cwe.mitre.org/data/definitions/799.html) +* [CWE-807 Reliance on Untrusted Inputs in a Security Decision](https://cwe.mitre.org/data/definitions/807.html) +* [CWE-841 Improper Enforcement of Behavioral Workflow](https://cwe.mitre.org/data/definitions/841.html) +* [CWE-1021 Improper Restriction of Rendered UI Layers or Frames](https://cwe.mitre.org/data/definitions/1021.html) +* [CWE-1022 Use of Web Link to Untrusted Target with window.opener Access](https://cwe.mitre.org/data/definitions/1022.html) +* [CWE-1125 Excessive Attack Surface](https://cwe.mitre.org/data/definitions/1125.html) + + +## X02:2025 Memory Management Failures + +### Background. + +Languagess like Java, C#, JavaScript/TypeScript (node.js), Go, and "safe" Rust are memory safe. Memory management problems tend to happen in non-memory safe languages such as C and C++. This category scored the lowest on the community survey and low in the data despite having the third most related CVEs. We believe this is due to the predominance of web applications over more traditional desktop applications. Memory management vulnerabilities frequently have the highest CVSS scores. + + +### Score table. + + + + + + + + + + + + + + + + + + + + + + + + + +
CWEs Mapped + Max Incidence Rate + Avg Incidence Rate + Max Coverage + Avg Coverage + Avg Weighted Exploit + Avg Weighted Impact + Total Occurrences + Total CVEs +
24 + 2.96% + 1.13% + 55.62% + 28.45% + 6.75 + 4.82 + 220,414 + 30,978 +
+ + + +### Description. + +When an application is forced to manage memory itself, it is very easy to make mistakes. Memory safe languages are being used more often, but there are still many legacy systems in production worldwide, new low-level systems that require the use of non-memory safe languages, and web applications that interact with mainframes, IoT devices, firmware, and other systems that may be forced to manage their own memory. Representative CWEs are *CWE-120 Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')* and *CWE-121 Stack-based Buffer Overflow*. + +Memory management failures can happen when: + +* You do not allocate enough memory for a variable +* You do not validate input, causing an overflow of the heap, the stack, a buffer +* You store a data value that is larger than the type of the variable can hold +* You attempt to use unallocated memory or address spaces +* You create off-by-one errors (counting from 1 instead of zero) +* You try to access an object after its been freed +* You use uninitialized variables +* You leak memory or otherwise use up all available memory in error until our application fails + +Memory management failures can lead to failure of the application or even the entire system, see also [X01:2025 Lack of Application Resilience](#x012025-lack-of-application-resilience) + + +### How to prevent. + +The best way to prevent memory management failures is to use a memory-safe language. Examples include Rust, Java, Go, C#, Python, Swift, Kotlin, JavaScript, etc. When creating new applications, try hard to convince your organization that it is worth the learning curve to switch to a memory-safe language. If performing a full refactor, push for a rewrite in a memory-safe language when it is possible and feasible. + +If you are unable to use a memory-safe language, perform the following: + +* Enable the following server features that make memory management errors harder to exploit: address space layout randomization (ASLR), Data Execution Protection (DEP), and Structured Exception Handling Overwrite Protection (SEHOP). +* Monitor your application for memory leaks. +* Validate all input to your system very carefully, and reject all input that does not meet expectations. +* Study the language you are using and make a list of unsafe and more-safe functions, then share that list with your entire team. If possible, add it to your secure coding guideline or standard. For example, in C, prefer strncpy() over strcpy() and strncat() over strcat(). +* If your language or framework offers memory safety libraries, use them. For example: Safestringlib or SafeStr. +* Use managed buffers and strings rather than raw arrays and pointers whenever possible. +* Take secure coding training that focuses on memory issues and/or your language of choice. Inform your trainer that you are concerned about memory management failures. +* Perform code reviews and/or static analyses. +* Use compiler tools that help with memory management such as StackShield, StackGuard, and Libsafe. +* Perform fuzzing on every input to your system. +* If you have a penetration test performed, inform your tester that you are concerned about memory management failures and that you would like them to pay special attention to this while testing. +* Fix all compiler errors *and* warnings. Do not ignore warnings because your program compiles. +* Ensure your underlying infrastructure is regularly patched, scanned, and hardened. +* Monitor your underlying infrastructure specifically for potential memory vulnerabilities and other failures. +* Consider using [canaries](https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries) to protect your address stack from overflow attacks. + +### Example attack scenarios. + +**Scenario #1:** Buffer overflows are the most famous memory vulnerability, a situation where an attacker submits more information into a field than it can accept, such that it overflows the buffer created for the underlying variable. In a successful attack, the overflow characters overwrite the stack pointer, allowing the attacker to insert malicious instructions into your program. + +**Scenario #2:** Use-After-Free (UAF) happens often enough that it’s a semi-common browser bug bounty submission. Imagine a web browser processing JavaScript that manipulates DOM elements. The attacker crafts a JavaScript payload that creates an object (such as a DOM element) and obtains references to it. Through careful manipulation, they trigger the browser to free the object's memory while keeping a dangling pointer to it. Before the browser realizes the memory has been freed, the attacker allocates a new object that occupies the *same* memory space. When the browser tries to use the original pointer, it now points to attacker-controlled data. If this pointer was for a virtual function table, the attacker can redirect code execution to their payload. + +**Scenario #3:** A network service that accepts user input, doesn’t properly validate or sanitize it, then passes it directly to the logging function. The input from the user is passed to the logging function as syslog(user_input) instead of syslog("%s", user_input), which doesn’t specify the format. The attacker sends malicious payloads containing format specifiers such as %x to read stack memory (sensitive data disclosure) or %n to write to memory addresses. By chaining together multiple format specifiers they could map out the stack, locate important addresses, and then overwrite them. This would be a Format string vulnerability (uncontrolled string format). + +Note: modern browsers use many levels of defenses to defend against such attacks, including [browser sandboxing](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing) ASLR, DEP/NX, RELRO, and PIE. A memory management failure attack on a browser is not a simple attack to carry out. + +### References. + +* [OWASP community pages: Memory leak,](https://owasp.org/www-community/vulnerabilities/Memory_leak) [Doubly freeing memory,](https://owasp.org/www-community/vulnerabilities/Doubly_freeing_memory) [& Buffer Overflow](https://owasp.org/www-community/vulnerabilities/Buffer_Overflow) +* [Awesome Fuzzing: a list of fuzzing resources](https://github.com/secfigo/Awesome-Fuzzing) +* [Project Zero Blog](https://googleprojectzero.blogspot.com) +* [Microsoft MSRC Blog](https://www.microsoft.com/en-us/msrc/blog) + +### List of Mapped CWEs +* [CWE-14 Compiler Removal of Code to Clear Buffers](https://cwe.mitre.org/data/definitions/14.html) +* [CWE-119 Improper Restriction of Operations within the Bounds of a Memory Buffer](https://cwe.mitre.org/data/definitions/119.html) +* [CWE-120 Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')](https://cwe.mitre.org/data/definitions/120.html) +* [CWE-121 Stack-based Buffer Overflow](https://cwe.mitre.org/data/definitions/121.html) +* [CWE-122 Heap-based Buffer Overflow](https://cwe.mitre.org/data/definitions/122.html) +* [CWE-124 Buffer Underwrite ('Buffer Underflow')](https://cwe.mitre.org/data/definitions/124.html) +* [CWE-125 Out-of-bounds Read](https://cwe.mitre.org/data/definitions/125.html) +* [CWE-126 Buffer Over-read](https://cwe.mitre.org/data/definitions/126.html) +* [CWE-190 Integer Overflow or Wraparound](https://cwe.mitre.org/data/definitions/190.html) +* [CWE-191 Integer Underflow (Wrap or Wraparound)](https://cwe.mitre.org/data/definitions/191.html) +* [CWE-196 Unsigned to Signed Conversion Error](https://cwe.mitre.org/data/definitions/196.html) +* [CWE-367 Time-of-check Time-of-use (TOCTOU) Race Condition](https://cwe.mitre.org/data/definitions/367.html) +* [CWE-415 Double Free](https://cwe.mitre.org/data/definitions/415.html) +* [CWE-416 Use After Free](https://cwe.mitre.org/data/definitions/416.html) +* [CWE-457 Use of Uninitialized Variable](https://cwe.mitre.org/data/definitions/457.html) +* [CWE-459 Incomplete Cleanup](https://cwe.mitre.org/data/definitions/459.html) +* [CWE-467 Use of sizeof() on a Pointer Type](https://cwe.mitre.org/data/definitions/467.html) +* [CWE-787 Out-of-bounds Write](https://cwe.mitre.org/data/definitions/787.html) +* [CWE-788 Access of Memory Location After End of Buffer](https://cwe.mitre.org/data/definitions/788.html) +* [CWE-824 Access of Uninitialized Pointer](https://cwe.mitre.org/data/definitions/824.html) + + + +## X03:2025 Inappropriate Trust in AI Generated Code ('Vibe Coding') + +### Background. + +Currently the entire world is talking about and using AI, and this includes software developers. Although there are currently no CVEs or CWEs related to AI generated code, it is well known and documented that AI generated code often contains more vulnerabilities than code written by human beings. + + +### Description. + +We are seeing software development practices change to include not only code written with the assistance of AI, but code written and committed almost entirely without human oversight (often referred to as vibe coding). Just as it was never a good idea to copy code snippets from blogs or websites without thinking twice, the problem is exacerbated in this case. Good, secure code snippets were and are rare and might be statistically neglected by AI due to system constraints. + + +### How to prevent. +We urge all people who write code to consider the following when using AI: + +* You should be able to read and fully understand all code you submit, even if it is written by an AI or copied from an online forum. You are responsible for all code that you commit. +* You should review all AI-assisted code thoroughly for vulnerabilities, ideally with your own eyes and also with security tooling made for this purpose (such as static analysis). Consider using classic code review techniques as described in [OWASP Cheat Sheet Series: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html). +* Ideally, write your own code, let the AI suggest improvements, check the AI's code, and let the AI make corrections until you are satisfied with the result. +* Consider using a Retrieval Augmented Generation (RAG) server with your own collected and reviewed secure code samples and documentation, such as your organization’s security coding guideline, standard, or policy, and have the RAG server enforce any policies or standards. +* Consider purchasing tooling that implements guardrails for privacy and security for use with your AI(s) of choice. +* Consider purchasing a private AI, ideally with a contract agreement (including a privacy agreement) that the AI is not to be trained on your organization’s data, queries, code or any other sensitive information. +* Consider implementing an Model Context Protocol (MCP) server in-between your IDE and AI, then set it up to enforce the use of your security tooling of choice. +* Implement policies and processes as part of your SDLC to inform developers (and all employees) of how they should and should not use AI within your organization. +* Create a list of good and effective prompts, that take IT security best practices into account. Ideally they should also consider your internal secure coding guidelines. Developers can use this prompts as a starting point for their programs. +* AI is likely to become part of each phase of your system development life cycle, both how to use it effectively and safely. Use it wisely. +* Actually it is **not** recommended to use vibe coding for complex functions, business critical programs, or programs that are used for a long time. +* Implement technical checks and safeguards against the use of Shadow AI. +* Train your developers on your policies, as well as safe AI usage and best practices for using AI in software development. + + +### References. + +* [OWASP Cheat Sheet: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html) + + +### List of Mapped CWEs +-none- From 93b1f5acbbfaae20ec57620513fdd2cf93e2c9cc Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Mon, 5 Jan 2026 00:23:47 +0900 Subject: [PATCH 083/167] start translation --- ...5-Mishandling_of_Exceptional_Conditions.md | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md new file mode 100644 index 000000000..25d43740c --- /dev/null +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -0,0 +1,142 @@ +# A10:2025 부적절한 예외 처리 + +![icon](../assets/TOP_10_Icons_Final_Mishandling_of_Exceptional_Conditions.png){: style="height:80px;width:80px" align="right"} + +## 배경. + +부적절한 예외 처리는 2025년에 신설된 카테고리다. 이 카테고리는 24개의 CWE를 포함하며, 부적절한 오류 처리, 논리적 오류, 안전하지 않은 실패(Failing Open), 그 외 시스템이 비정상적인 상황에서 마주할 수 있는 시나리오를 다룬다. 이 카테고리에는 이전에 "코드 품질 저하"와 연관되었던 일부 CWE가 포함되어 있다. 기존 분류는 너무 광범위했으며, 이처럼 구체적인 카테고리가 더 명확한 가이드를 제공한다고 판단했다. + +대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족에 대한 부적절한 처리*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 안전하지 않은 실패(Failing Open)*가 있다. + + +## Score table. + + + + + + + + + + + + + + + + + + + + + + + + + +
해당되는 CWE 개수 + 최대 취약점 발생률 + 평균 취약점 발생률 + 최대 테스트 커버리지 + 평균 테스트 커버리지 + 가중 평균 악용도 + 가중 평균 영향도 + 총 발생 건수 + 총 CVE 건수 +
24 + 20.67% + 2.95% + 100.00% + 37.95% + 7.11 + 3.81 + 769,581 + 3,416 +
+ + + +## 설명. + +부적절한 예외 처리는 프로그램이 비정상적이고 예측 불가능한 상황을 예방, 탐지, 대응하지 못할 때 발생하며, 이로 인해 시스템 충돌, 예상치 못한 동작, 때로는 보안 취약점까지 초래할 수 있다. 이는 다음 세 가지 실패 중 하나 이상을 포함한다. 비정상적인 상황을 사전에 예방하지 못하거나, 발생 시 이를 식별하지 못하거나, 발생 후 적절히 대응하지 못하는 경우다. + +예외 상황은 다음과 같은 원인으로 발생할 수 있다. 누락되거나 불완전한 입력 검증, 발생 지점이 아닌 상위 레벨에서의 지연된 오류 처리, 메모리·권한·네트워크 문제 등 예기치 않은 환경 상태, 일관성 없는 예외 처리, 또는 전혀 처리되지 않는 예외로 인해 시스템이 알 수 없고 예측 불가능한 상태에 빠지는 경우다. 애플리케이션이 다음에 무엇을 해야 할지 알 수 없는 상태에 빠진다면, 예외 처리가 실패한 것이다. 이러한 오류와 예외는 발견이 어려워 장기간 보안을 위협할 수 있다. + +부적절한 예외 처리로 인해 다양한 보안 취약점이 발생할 수 있다. 예를 들어 논리 버그, 오버플로우, 레이스 컨디션, 부정 거래, 메모리·상태·리소스·타이밍·인증·인가 관련 문제 등이 있다. 이러한 유형의 취약점은 시스템 또는 데이터의 기밀성, 가용성, 무결성에 부정적인 영향을 미칠 수 있다. 공격자는 애플리케이션의 결함 있는 오류 처리를 악용하여 이 취약점을 공격한다. + +## 대응 방안. + +## 대응 방안 + +예외 상황을 적절히 처리하려면 이러한 상황에 대비한 계획을 세워야 한다(최악의 상황을 예상하라). 모든 시스템 오류를 발생 지점에서 직접 캐치(catch)하고, 이를 처리해야 한다. 여기서 처리란 문제 해결을 위한 의미 있는 조치를 취하고 정상 상태로 복구하는 것을 의미한다. 처리 과정에는 오류 발생 시 사용자에게 이해하기 쉬운 방식으로 알리고, 이벤트를 로깅하며, 필요하다고 판단되면 알림을 발송하는 것이 포함되어야 한다. 또한 놓친 예외가 있을 경우를 대비해 전역 예외 핸들러(Global Exception Handler)를 구현해야 한다. 이상적으로는 반복되는 오류나 진행 중인 공격을 나타내는 패턴을 감시하고, 이에 대응·방어·차단할 수 있는 모니터링 또는 옵저버빌리티 도구를 갖추는 것이 좋다. 이를 통해 오류 처리 취약점을 악용하는 스크립트와 봇에 대응하고 차단할 수 있다. + +예외 상황을 캐치하고 처리하면 프로그램의 기반 인프라가 예측 불가능한 상황에 노출되는 것을 방지할 수 있다. 트랜잭션 처리 도중이라면, 트랜잭션의 모든 부분을 롤백하고 처음부터 다시 시작하는 것이 매우 중요하다(이를 안전한 실패[Failing Closed]라고 한다). 트랜잭션을 중간 상태에서 복구하려는 시도는 종종 복구 불가능한 오류를 만들어낸다. + +가능하다면 속도 제한(Rate Limiting), 리소스 쿼터, 스로틀링 등 다양한 제한을 적용하여 애초에 예외 상황이 발생하지 않도록 예방하라. 정보 기술에서 무제한이어야 하는 것은 없다. 제한이 없으면 애플리케이션 복원력 저하, 서비스 거부(DoS), 무차별 대입 공격 성공, 과도한 클라우드 비용 등의 문제가 발생할 수 있다. + +특정 빈도 이상으로 동일한 오류가 반복될 경우, 개별 오류 메시지 대신 발생 횟수와 시간대를 보여주는 통계 형태로 출력하는 것을 고려하라. 이 정보는 자동화된 로깅 및 모니터링을 방해하지 않도록 원본 메시지에 추가하는 방식으로 처리해야 한다. [A09:2025 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)를 참고하라. + +이 외에도 다음 사항을 포함해야 한다: 엄격한 입력 검증(허용해야 하는 위험 문자에 대한 새니타이징 또는 이스케이프 처리 포함), 중앙 집중화된 오류 처리·로깅·모니터링·알림 체계, 그리고 전역 예외 핸들러다. 하나의 애플리케이션에서 예외 처리를 위한 여러 함수를 두어서는 안 되며, 한 곳에서 동일한 방식으로 처리해야 한다. 또한 이 섹션의 모든 권고 사항에 대해 프로젝트 보안 요구사항을 수립하고, 설계 단계에서 위협 모델링 또는 보안 설계 검토를 수행하며, 코드 리뷰나 정적 분석을 실시하고, 최종 시스템에 대해 스트레스·성능·침투 테스트를 수행해야 한다. + +가능하다면 조직 전체가 동일한 방식으로 예외 상황을 처리하는 것이 좋다. 이렇게 하면 이 중요한 보안 통제에 대한 코드 리뷰와 감사가 더 쉬워진다. + + + +If possible, your entire organization should handle exceptional conditions in the same way, as it makes it easier to review and audit code for errors in this important security control. + + +## Example attack scenarios. + +**Scenario #1:** Resource exhaustion via mishandling of exceptional conditions (Denial of Service) could be caused if the application catches exceptions when files are uploaded, but doesn’t properly release resources after. Each new exception leaves resources locked or otherwise unavailable, until all resources are used up. + +**Scenario #2:** Sensitive data exposure via improper handling or database errors that reveals the full system error to the user. The attacker continues to force errors in order to use the sensitive system information to create a better SQL injection attack. The sensitive data in the user error messages are reconnaissance. + +**Scenario #3:** State corruption in financial transactions could be caused by an attacker interrupting a multi-step transaction via network disruptions. Imagine the transaction order was: debit user account, credit destination account, log transaction. If the system doesn’t properly roll back the entire transaction (fail closed) when there is an error part way through, the attacker could potentially drain the user’s account, or possibly a race condition that allows the attacker to send money to the destination multiple times. + + +## References. + +OWASP MASVS‑RESILIENCE + +- [OWASP Cheat Sheet: Logging](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html) + +- [OWASP Cheat Sheet: Error Handling](https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html) + +- [OWASP Application Security Verification Standard (ASVS): V16.5 Error Handling](https://github.com/OWASP/ASVS/blob/master/5.0/en/0x25-V16-Security-Logging-and-Error-Handling.md#v165-error-handling) + +- [OWASP Testing Guide: 4.8.1 Testing for Error Handling](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/08-Testing_for_Error_Handling/01-Testing_For_Improper_Error_Handling) + +* [Best practices for exceptions (Microsoft, .Net)](https://learn.microsoft.com/en-us/dotnet/standard/exceptions/best-practices-for-exceptions) + +* [Clean Code and the Art of Exception Handling (Toptal)](https://www.toptal.com/developers/abap/clean-code-and-the-art-of-exception-handling) + +* [General error handling rules (Google for Developers)](https://developers.google.com/tech-writing/error-messages/error-handling) + +* [Example of real-world mishandling of an exceptional condition](https://www.firstreference.com/blog/human-error-and-internal-control-failures-cause-us62m-fine/) + +## List of Mapped CWEs +* [CWE-209 Generation of Error Message Containing Sensitive Information](https://cwe.mitre.org/data/definitions/209.html) +* [CWE-215 Insertion of Sensitive Information Into Debugging Code](https://cwe.mitre.org/data/definitions/215.html) +* [CWE-234 Failure to Handle Missing Parameter](https://cwe.mitre.org/data/definitions/234.html) +* [CWE-235 Improper Handling of Extra Parameters](https://cwe.mitre.org/data/definitions/235.html) +* [CWE-248 Uncaught Exception](https://cwe.mitre.org/data/definitions/248.html) +* [CWE-252 Unchecked Return Value](https://cwe.mitre.org/data/definitions/252.html) +* [CWE-274 Improper Handling of Insufficient Privileges](https://cwe.mitre.org/data/definitions/274.html) +* [CWE-280 Improper Handling of Insufficient Permissions or Privileges](https://cwe.mitre.org/data/definitions/280.html) +* [CWE-369 Divide By Zero](https://cwe.mitre.org/data/definitions/369.html) +* [CWE-390 Detection of Error Condition Without Action](https://cwe.mitre.org/data/definitions/390.html) +* [CWE-391 Unchecked Error Condition](https://cwe.mitre.org/data/definitions/391.html) +* [CWE-394 Unexpected Status Code or Return Value](https://cwe.mitre.org/data/definitions/394.html) +* [CWE-396 Declaration of Catch for Generic Exception](https://cwe.mitre.org/data/definitions/396.html) +* [CWE-397 Declaration of Throws for Generic Exception](https://cwe.mitre.org/data/definitions/397.html) +* [CWE-460 Improper Cleanup on Thrown Exception](https://cwe.mitre.org/data/definitions/460.html) +* [CWE-476 NULL Pointer Dereference](https://cwe.mitre.org/data/definitions/476.html) +* [CWE-478 Missing Default Case in Multiple Condition Expression](https://cwe.mitre.org/data/definitions/478.html) +* [CWE-484 Omitted Break Statement in Switch](https://cwe.mitre.org/data/definitions/484.html) +* [CWE-550 Server-generated Error Message Containing Sensitive Information](https://cwe.mitre.org/data/definitions/550.html) +* [CWE-636 Not Failing Securely ('Failing Open')](https://cwe.mitre.org/data/definitions/636.html) +* [CWE-703 Improper Check or Handling of Exceptional Conditions](https://cwe.mitre.org/data/definitions/703.html) +* [CWE-754 Improper Check for Unusual or Exceptional Conditions](https://cwe.mitre.org/data/definitions/754.html) +* [CWE-755 Improper Handling of Exceptional Conditions](https://cwe.mitre.org/data/definitions/755.html) +* [CWE-756 Missing Custom Error Page](https://cwe.mitre.org/data/definitions/756.html) From 57c135f9d69d5e470255be246faba7f85683dccb Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Mon, 5 Jan 2026 00:32:52 +0900 Subject: [PATCH 084/167] Overall first translation --- ...2025-Mishandling_of_Exceptional_Conditions.md | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index 25d43740c..232917474 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -81,21 +81,15 @@ 가능하다면 조직 전체가 동일한 방식으로 예외 상황을 처리하는 것이 좋다. 이렇게 하면 이 중요한 보안 통제에 대한 코드 리뷰와 감사가 더 쉬워진다. - +## 공격 시나리오 예시. -If possible, your entire organization should handle exceptional conditions in the same way, as it makes it easier to review and audit code for errors in this important security control. +**시나리오 1:** 애플리케이션이 파일 업로드 시 예외를 캐치하되 리소스를 해제하지 않으면, 예외가 발생할 때마다 리소스가 잠긴 채로 남는다. 이로 인해 리소스가 고갈되어 서비스 거부(DoS)로 이어질 수 있다. +**시나리오 2:** 데이터베이스 오류가 사용자에게 그대로 노출되면 민감한 시스템 정보가 유출된다. 공격자는 이를 악용해 의도적으로 오류를 유발하고, 수집한 정보를 기반으로 더 정교한 SQL 인젝션 공격을 구성할 수 있다. -## Example attack scenarios. +**시나리오 3:** 공격자가 네트워크 중단을 일으켜 다단계 금융 트랜잭션을 방해할 수 있다. 예를 들어 트랜잭션이 "출금 → 입금 → 로깅" 순서로 처리될 때, 중간에 오류가 발생해도 시스템이 전체를 롤백(안전한 실패)하지 않으면 문제가 생긴다. 공격자는 이를 악용해 사용자 계좌에서 돈만 빠져나가게 하거나, 레이스 컨디션을 이용해 대상 계좌로 여러 번 송금할 수 있다. -**Scenario #1:** Resource exhaustion via mishandling of exceptional conditions (Denial of Service) could be caused if the application catches exceptions when files are uploaded, but doesn’t properly release resources after. Each new exception leaves resources locked or otherwise unavailable, until all resources are used up. - -**Scenario #2:** Sensitive data exposure via improper handling or database errors that reveals the full system error to the user. The attacker continues to force errors in order to use the sensitive system information to create a better SQL injection attack. The sensitive data in the user error messages are reconnaissance. - -**Scenario #3:** State corruption in financial transactions could be caused by an attacker interrupting a multi-step transaction via network disruptions. Imagine the transaction order was: debit user account, credit destination account, log transaction. If the system doesn’t properly roll back the entire transaction (fail closed) when there is an error part way through, the attacker could potentially drain the user’s account, or possibly a race condition that allows the attacker to send money to the destination multiple times. - - -## References. +## 참조. OWASP MASVS‑RESILIENCE From a37f02c022f689023e9dd9fa0a2d270171407f19 Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Mon, 5 Jan 2026 00:33:35 +0900 Subject: [PATCH 085/167] Insert missing reference link in the original text --- 2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index 232917474..ed8998629 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -91,7 +91,7 @@ ## 참조. -OWASP MASVS‑RESILIENCE +- [OWASP MASVS‑RESILIENCE](https://mas.owasp.org/MASVS/11-MASVS-RESILIENCE/) - [OWASP Cheat Sheet: Logging](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html) From d59b963a4c5a5dfb5dd1c525dc6a9a046782c101 Mon Sep 17 00:00:00 2001 From: ni5am Date: Mon, 5 Jan 2026 00:35:30 +0900 Subject: [PATCH 086/167] Update category names --- 2025/docs/ko/0x00_2025-Introduction.md | 44 +++++++++++++------------- 2025/docs/ko/index.md | 21 ++++++------ 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 2a8e3a5da..a3a842362 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -12,16 +12,16 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! -* [A01:2025 - Broken_Access_Control](A01_2025-Broken_Access_Control.md) -* [A02:2025 - Security_Misconfiguration](A02_2025-Security_Misconfiguration.md) -* [A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md) -* [A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md) -* [A05:2025 - Injection](A05_2025-Injection.md) -* [A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md) -* [A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md) -* [A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md) -* [A09:2025 - Security_Logging_and_Alerting_Failures](A09_2025-Security_Logging_and_Alerting_Failures.md) -* [A10:2025 - Mishandling_of_Exceptional_Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md) +* [A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md) +* [A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md) +* [A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md) +* [A04:2025 - 암호 체계 실패](A04_2025-Cryptographic_Failures.md) +* [A05:2025 - 인젝션](A05_2025-Injection.md) +* [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) +* [A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md) +* [A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md) +* [A09:2025 - 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md) +* [A10:2025 - 부적절한 예외 처리](A10_2025-Mishandling_of_Exceptional_Conditions.md) ## 2025년 Top 10의 변화 @@ -30,16 +30,16 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ![Mapping](../assets/2025-mappings.png) -* **[A01:2025 - Broken Access Control](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. -* **[A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. -* **[A03:2025 - Software_Supply_Chain_Failures](A03_2025-Software_Supply_Chain_Failures.md)**기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. -* **[A04:2025 - Cryptographic_Failures](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. -* **[A05:2025 - Injection](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동은 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. -* **[A06:2025 - Insecure_Design](A06_2025-Insecure_Design.md)**은 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 눈에 띄는 개선이 확인되었다. -* **[A07:2025 - Authentication_Failures](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/A07_-Identificatio_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다 -* **[A08:2025 - Software_or_Data_Integrity_Failures](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 Software Supply Chain Failures보다 상대적으로 더 로우 레벨(Lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary) 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. -* **[A09:2025 - Security Logging & Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 로그에서 발생한 이벤트에 대해 적절한 대응을 위한 알림(Alert) 기능의 중요성을 강조하기 위한 것이다. 알림 체계가 결여된 로깅은 보안 사고를 식별하는 데 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. -* **[A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(Fail Open) 등 비정상적인 상태에서 비롯되는 24개 CWE를 포함하고 있다. +* **[A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. +* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. +* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. +* **[A04:2025 - 암호 체계 실패](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. +* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동은 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. +* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**은 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 눈에 띄는 개선이 확인되었다. +* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/A07_-Identificatio_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다 +* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 Software Supply Chain Failures보다 상대적으로 더 로우 레벨(Lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary) 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. +* **[A09:2025 - 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 로그에서 발생한 이벤트에 대해 적절한 대응을 위한 알림(Alert) 기능의 중요성을 강조하기 위한 것이다. 알림 체계가 결여된 로깅은 보안 사고를 식별하는 데 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. +* **[A10:2025 - 부적절한 예외 처리](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(Fail Open) 등 비정상적인 상태에서 비롯되는 24개 CWE를 포함하고 있다. ## 방법론 @@ -51,9 +51,9 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! 이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트 된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE의 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 이번 버전에서도 CWE의 발생 빈도를 분석에서 제외한다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 퍼져있는 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경이 불가피하였다. -CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. 근본 원인의 유형에는 "Cryptographic Failure", "Misconfiguration" 등이 있고, 증상 유형에는 "Sensitive Data Exposure", "Denial of Service" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근분 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-Software Supply Chain Failures, A09:2025-Security Logging and Alerting Failures)에서 최대 40개(A01:2025-Broken Access Control)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. +CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. 근본 원인의 유형에는 "암호 체계 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근분 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. -MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다.모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않는 경우 도구, 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 Injection, Command Injection, Cross-site Scripting, Hardcoded Passwords, Lack of Validation, Buffer Overflows, Cleartext Storage of Sensitive Information 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. +MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다.모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않는 경우 도구, 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 인젝션, 커멘드 인젝션, 크로스 사이트 스크립팅, 하드코딩된 패스워드, 검증 부재, 버퍼 오버플로우, 민감 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. ## 카테고리 선정을 위한 데이터 사용법 diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index c628f0f03..82da40c85 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -24,16 +24,17 @@ OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제 ### Top 10:2025 목록 -1. [A01:2025 - 불충분한 접근 제어](A01_2025-Broken_Access_Control.md) -2. [A02:2025 - Security Misconfiguration](A02_2025-Security_Misconfiguration.md) -3. [A03:2025 - Software Supply Chain Failures](A03_2025-Software_Supply_Chain_Failures.md) -4. [A04:2025 - Cryptographic Failures](A04_2025-Cryptographic_Failures.md) -5. [A05:2025 - Injection](A05_2025-Injection.md) -6. [A06:2025 - Insecure Design](A06_2025-Insecure_Design.md) -7. [A07:2025 - Authentication Failures](A07_2025-Authentication_Failures.md) -8. [A08:2025 - Software or Data Integrity Failures](A08_2025-Software_or_Data_Integrity_Failures.md) -9. [A09:2025 - Security Logging and Alerting Failures](A09_2025-Security_Logging_and_Alerting_Failures.md) -10. [A10:2025 - Mishandling of Exceptional Conditions](A10_2025-Mishandling_of_Exceptional_Conditions.md) +1. [A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md) +2. [A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md) +3. [A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md) +4. [A04:2025 - 암호 체계 실패](A04_2025-Cryptographic_Failures.md) +5. [A05:2025 - 인젝션](A05_2025-Injection.md) +6. [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) +7. [A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md) +8. [A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md) +9. [A09:2025 - 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md) +10. [A10:2025 - 부적절한 예외 처리](A10_2025-Mishandling_of_Exceptional_Conditions.md) + --- From d64920775ae04e87049ccd9f69c9f05fcde084b9 Mon Sep 17 00:00:00 2001 From: ni5am Date: Mon, 5 Jan 2026 00:40:53 +0900 Subject: [PATCH 087/167] Update category names into korean --- ...3_2025-Establishing_a_Modern_Application_Security_Program.md | 2 +- 2025/docs/ko/A07_2025-Authentication_Failures.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 24a68e060..05b8a792b 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -299,4 +299,4 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능하게 정의하도록 설계되었고 보안 안전한 개발 수명 주기(SDLC) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)]((https://owasp.org/www-project-application-security-verification-standard/))를 기준으로 활용하는 것을 권고한다. -특히 보안 도구 벤더 관점에서는 ASVS를 기준으로 삼는 것이 유일한 선택지이다. OWASP Top 10은 위험 중심으로 구성되어 있기에, [A06:2025 - Insecure Design](A06_2025-Insecure_Design.md) 사례와 마찬가지로 자동화 도구만으로 모든 Top 10 항목을 포괄적으로 탐지, 테스트, 방어하기 어렵다. 따라서, 벤더들은 Top 10을 전부 보장한다고 주장하지 않았으면 한다. 왜냐하면 이는 사실이 아니기 때문이다. +특히 보안 도구 벤더 관점에서는 ASVS를 기준으로 삼는 것이 유일한 선택지이다. OWASP Top 10은 위험 중심으로 구성되어 있기에, [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) 사례와 마찬가지로 자동화 도구만으로 모든 Top 10 항목을 포괄적으로 탐지, 테스트, 방어하기 어렵다. 따라서, 벤더들은 Top 10을 전부 보장한다고 주장하지 않았으면 한다. 왜냐하면 이는 사실이 아니기 때문이다. diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index 794ca1433..d9ae93404 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -68,7 +68,7 @@ * 안전하지 않은 "질문-답변 방식 비밀번호 찾기"과 같은 취약하거나 비효율적인 자격 증명 복구 및 비밀번호 찾기 프로세스를 사용하는 경우. -* 평문, 암호화된, 또는 약한 해시(hash)로 해시된 비밀번호를 사용하는 경우. [A04:2025-Cryptographic Failures](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/) 참고. +* 평문, 암호화된, 또는 약한 해시(hash)로 해시된 비밀번호를 사용하는 경우. [A04:2025-암호 체계 실패](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/) 참고. * 다중 인증(MFA)이 누락되어 있거나 효과적이지 않은 경우. From 4bd45b69af62b512d5502d150e5628764cb5ffee Mon Sep 17 00:00:00 2001 From: ni5am Date: Mon, 5 Jan 2026 00:47:30 +0900 Subject: [PATCH 088/167] Add Korean translation --- 2025/mkdocs.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/2025/mkdocs.yml b/2025/mkdocs.yml index 35bee0cc0..32587b5f9 100644 --- a/2025/mkdocs.yml +++ b/2025/mkdocs.yml @@ -48,6 +48,27 @@ plugins: default: true name: en - English build: true + - locale: ko + name: ko - 한국어 + build: true + nav_translations: + Home: 홈 + Introduction: 소개 + About OWASP: OWASP 소개 + What are Application Security Risks?: 애플리케이션 보안 위험이란 무엇인가? + Establishing a Modern Application Security Program: 현대적 애플리케이션 보안 체계를 수립하는 법 + Top 10:2025 List: OWASP Top 10:2025 목록 + A01 Broken Access Control: A01 충분한 접근 제어 + A02 Security Misconfiguration: A02 보안 설정 오류 + A03 Software Supply Chain Failures: A03 소프트웨어 공급망 실패 + A04 Cryptographic Failures: A04 암호 체계 실패 + A05 Injection: A05 인젝션 + A06 Insecure Design: A06 안전하지 않은 설계 + A07 Authentication Failures: A07 인증 실패 + A08 Software or Data Integrity Failures: A08 소프트웨어 또는 데이터 무결성 실패 + A09 Security Logging and Alerting Failures: A09 보안 로깅 및 알림 실패 + A10 Mishandling of Exceptional Conditions: A10 부적절한 예외 처리 + Next Steps: 다음 단계 nav_translations: SAMPLE: From c17dc4b6f9a719e25484772d2e7d1168726df21b Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Mon, 5 Jan 2026 05:55:06 +0900 Subject: [PATCH 089/167] Translate X01_2025-Next_Steps.md --- 2025/docs/ko/X01_2025-Next_Steps.md | 230 ++++++++++++++-------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index 49d350e68..ec3f9ad95 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -1,39 +1,39 @@ -# Next Steps +# 다음 단계 -By design, the OWASP Top 10 is innately limited to the ten most significant risks. Every OWASP Top 10 has “on the cusp” risks considered at length for inclusion, but in the end, didn't make the cut. The other risks were more prevalent and impactful. +OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선정한다. 각 버전의 OWASP Top 10에는 포함 여부를 두고 충분히 검토되었으나, 다른 위험들이 더 빈번하게 발생하고 영향도도 더 컸기 때문에 최종 목록에 포함되지 않은 "경계선상(on the cusp)" 위험들이 존재한다. -The following two issues are well worth the effort to identify and remediate, organizations working towards a mature appsec program, security consultancies, or tool vendors wishing to expand coverage for their offerings. +아래의 세 가지 이슈는 발견 및 조치에 투자할 만한 가치가 크며, 성숙한 애플리케이션 보안 프로그램을 목표로 하는 조직, 보안 자문 회사, 또는 제품의 커버리지를 확장하려는 보안 도구 벤더에 특히 유용하게 사용될 수 있다. -## X01:2025 Lack of Application Resilience +## X01:2025 애플리케이션 복원력 부족 -### Background. +### 배경. -This is a renaming of 2021’s Denial of Service. That was renamed as it described a symptom rather than a root cause. This category focuses on CWEs that describe weaknesses that are related to resilience issues. The scoring of this category was very close with A10:2025-Mishandling of Exceptional Conditions. Relevant CWEs include: *CWE-400 Uncontrolled Resource Consumption, CWE-409 Improper Handling of Highly Compressed Data (Data Amplification), CWE-674 Uncontrolled Recursion*, and *CWE-835 Loop with Unreachable Exit Condition ('Infinite Loop').* +이 카테고리는 2021년의 서비스 거부(Denial of Service)를 재명명한 것이다. 기존 명칭은 근본 원인보다는 발생 현상을 설명하는 성격이 강해, 이를 보완하기 위해 재명명되었다. 이 카테고리는 복원력과 관련된 약점을 설명하는 CWE에 초점을 둔다. 점수 산정은 A10:2025-부적절한 예외 처리와 매우 근접했다. 관련된 CWE로는 *CWE-400 통제되지 않은 자원 소비, CWE-409 고압축 데이터의 부적절한 처리(데이터 증폭), CWE-674 통제되지 않은 재귀*, 그리고 *CWE-835 종료 조건에 도달할 수 없는 루프(무한루프).*가 있다. -### Score table. +### 점수표. - - - - - - - - - @@ -60,44 +60,44 @@ This is a renaming of 2021’s Denial of Service. That was renamed as it describ -### Description. +### 설명. -This category represents a systemic weakness in how applications respond to stress, failures, and edge cases that it is unable to recover from failure. When an application does not gracefully handle, withstand, or recover from unexpected conditions, resource constraints, and other adverse events it can easily result in availability issues (most commonly), but also data corruption, sensitive data disclosure, cascading failures, and/or bypasses of security controls. +이 카테고리는 애플리케이션이 스트레스, 장애 및 예외 케이스에 대응하는 방식 전반에 존재하는 시스템적 약점을 의미하며, 그 결과 장애 상황에서 애플리케이션이 정상 상태로 복구하지 못할 수 있다. 애플리케이션이 예기치 않은 조건, 리소스 제약 및 기타 불리한 이벤트를 원활하게(gracefully) 처리하지 못하거나, 견디지 못하거나, 또는 복구하지 못할 경우, 가용성 문제(일반적으로)로 이어지며, 그 외에도 데이터 손상, 민감 데이터 노출, 연쇄 장애, 및/또는 보안 통제 우회를 유발할 수 있다. -Furthermore [X02:2025 Memory Management Failures](#x022025-memory-management-failures) can also lead to failure of the application or even the entire system. +또한 [X02:2025 메모리 관리 실패](#x022025-memory-management-failures) 역시 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있다. -### How to prevent +### 대응방안. -In order to prevent this type of vulnerability you must design for failure and recovery of your systems. +이 유형의 취약점을 예방하기 위해서는 시스템의 장애와 복구를 기본 전제로 설계해야 한다. -* Add limits, quotas, and failover functionality, paying special attention to the most resource consuming operations -* Identify resource intensive pages and plan ahead: Reduce attack surface especially not exposing unneeded ‘gadgets’ and functions that require a lot of resources (e.g. CPU, memory) to unknown or untrusted users -* Perform strict input validation with allow-lists and size limitations, then test thoroughly -* Limit response sizes, and never send raw responses back to the client (process on the server side) -* Default to safe/closed (never open), deny by default and roll back if there’s an error -* Avoid blocking synchronous calls in request threads (use asynchronous/non-blocking, have timeouts, have concurrency limits, etc.) -* Carefully test your error handling functionality -* Implement resilience patterns such as circuit breakers, bulkheads, retry logic, and graceful degradation -* Do performance and load testing; add chaos engineering if you have the risk appetite for it -* Implement and architect for redundancy where reasonable and affordable -* Implement monitoring, observability, and alerting -* Filter invalid sender addresses in accordance with RFC 2267 -* Block known botnets by finger prints, IPs, or dynamically by behavior -* Proof-of-Work: initiate resource consuming operations at the *attackers* side that does not have big impacts on normal users but impacts bots trying to send a huge amount of requests. Make the Proof-of-Work more difficult if the general load of the system raises, especially for systems that are less trustworthy or appear to be bots -* Limit server side session time based on inactivity and a final timeout -* Limit session bound information storage +* 제한, 할당량 및 장애 극복 기능(failover) 기능을 추가하되, 특히 자원을 가장 많이 소모하는 작업에 주의를 기울인다. +* 자원 소모가 큰 페이지를 식별하고 사전에 대비해야 한다: 공격 표면을 줄이되, 특히 불명의 또는 신뢰할 수 없는 사용자에게 불필요한 '가젯(gadgets)'과 많은 자원(예: CPU, 메모리)을 요구하는 기능을 노출하지 않도록 한다. +* 입력값은 크기 제한을 적용하고 허용 리스트 기반으로 엄격히 검증한뒤, 철저히 테스트한다. +* 응답 크기를 제한하고, 가공되지 않은(raw) 응답을 클라이언트에 그대로 반환하지 않는다(서버 측에서 우선 처리한다). +* 기본값으로 안전/차단(절대로 오픈을 사용하지 않는다)로 설정하고, 우선적으로 차단(deny by default)하며, 오류가 발생하면 롤백한다. +* 리퀘스트 스레드에서 동기식 차단 호출(blocking synchronous call)을 피한다(비동기/논블로킹 사용, 타임아웃 설정, 동시성 제한 등). +* 에러 처리 기능을 신중하게 테스트한다. +* 서킷 브레이커, 격벽(bulkhead), 다시 시도(retry logic), 우아한 성능 저하(graceful degradation)와 같은 복원력 패턴을 구현한다. +* 성능 및 부하 테스트를 수행한다. 조직의 위험 수용 범위 내에서 카오스 엔지니어링을 도입한다. +* 합리적이고 비용적으로 감당 가능한 범위에서 이중화(redundancy)을 구현하고, 이를 전제로 아키텍처를 설계한다. +* 모니터링, 옵저버빌리티, 알림을 구현한다. +* RFC 2267을 준수해 잘못된 발신자 주소를 필터링한다. +* 핑거프린트, IP 또는 행위 기반 동적 탐지로 알려진 봇넷을 차단한다. +* 작업 증명(Proof-of-Work) 적용. 자격 증명을 적용하여 자원 소모 작업을 서버가 아니라 *공격자* 측에 부과한다. 정상 사용자 경험에 미치는 영향은 최소화하고, 시스템 부하가 상승할수록 자격증명 난이도를 높이고, 특히 신뢰도가 낮거나 봇으로 판단되는 트래픽에는 더 높은 난이도를 적용한다. +* 비활성 시간과 최종 타임아웃을 기준으로 서버 측 세션 시간을 제한한다. +* 세션에 저장되는 상태 정보는 최소화한다. -### Example attack scenarios. +### 공격 시나리오 예시. -**Scenario #1:** Attackers intentionally consume application resources to trigger failures within the system, resulting in denial of service. This could be memory exhaustion, filling up disk space, CPU saturation, or opening endless connections. +**시나리오 1:** 공격자가 리소스 소모를 유도해 시스템 장애를 유발하고, 결과적으로 서비스 거부(DoS) 상태를 만든다. 예로 메모리 고갈, 디스크 용량 소진, CPU 사용량 포화, 커넥션 무제한 연결 등이 있다. -**Scenario #2:** Input fuzzing that leads to crafted responses that break application business logic. +**시나리오 2:** 입력값 퍼징을 통해 비정상 입력을 대량 주입하고, 그 결과 비즈니스 로직을 오동작시키는 형태의 응답이 유도되도록 만든다. -**Scenario #3:** Attackers focus on the application’s dependencies, taking down APIs or other external services, and the application is unable to continue. +**시나리오 3:** 공격자가 애플리케이션의 의존성을 공격하여 API 또는 기타 외부 서비스를 다운시키며, 애플리케이션이 동작할 수 없게 한다. -### References. +### 참조. * [OWASP Cheat Sheet: Denial of Service](https://cheatsheetseries.owasp.org/cheatsheets/Denial_of_Service_Cheat_Sheet.html) * [OWASP MASVS‑RESILIENCE](https://mas.owasp.org/MASVS/11-MASVS-RESILIENCE/) @@ -107,7 +107,7 @@ In order to prevent this type of vulnerability you must design for failure and r * [NIST Cybersecurity Framework (CSF)](https://www.nist.gov/cyberframework) * [Avoid Blocking Calls: Go Async in Java (Devlane)](https://www.devlane.com/blog/avoid-blocking-calls-go-async-in-java) -### List of Mapped CWEs +### 해당되는 CWE 목록. * [CWE-73 External Control of File Name or Path](https://cwe.mitre.org/data/definitions/73.html) * [CWE-183 Permissive List of Allowed Inputs](https://cwe.mitre.org/data/definitions/183.html) * [CWE-256 Plaintext Storage of a Password](https://cwe.mitre.org/data/definitions/256.html) @@ -149,35 +149,35 @@ In order to prevent this type of vulnerability you must design for failure and r * [CWE-1125 Excessive Attack Surface](https://cwe.mitre.org/data/definitions/1125.html) -## X02:2025 Memory Management Failures +## X02:2025 메모리 관리 실패 -### Background. +### 배경. -Languagess like Java, C#, JavaScript/TypeScript (node.js), Go, and "safe" Rust are memory safe. Memory management problems tend to happen in non-memory safe languages such as C and C++. This category scored the lowest on the community survey and low in the data despite having the third most related CVEs. We believe this is due to the predominance of web applications over more traditional desktop applications. Memory management vulnerabilities frequently have the highest CVSS scores. +Java, C#, JavaScript/TypeScript(node.js), Go, 그리고 "안전" Rust와 같은 언어는 메모리 안전이다. 메모리 관리 문제는 C 및 C++와 같은 비메모리 안전 언어에서 발생하는 경향이 있다. 이 카테고리는 관련 CVE가 세 번째로 많음에도 불구하고, 커뮤니티 설문에서는 가장 낮은 점수를 받았고 데이터 상에서도 낮게 나타났다. 이는 전통적인 데스크톱 애플리케이션보다 웹 애플리케이션이 우세하기 때문이라고 본다. 메모리 관리 취약점은 주로 가장 높은 CVSS 점수를 가진다. -### Score table. +### 점수표.
CWEs Mapped + 해당되는 CWE 개수 Max Incidence Rate + 최대 취약점 발생률 Avg Incidence Rate + 평균 취약점 발생률 Max Coverage + 최대 테스트 커버리지 Avg Coverage + 평균 테스트 커버리지 Avg Weighted Exploit + 평균 가중 악용도 Avg Weighted Impact + 평균 가중 영향도 Total Occurrences + 총 발생 건수 Total CVEs + 총 CVE 건수
- - - - - - - - - @@ -204,64 +204,64 @@ Languagess like Java, C#, JavaScript/TypeScript (node.js), Go, and "safe" Rust a -### Description. +### 설명. -When an application is forced to manage memory itself, it is very easy to make mistakes. Memory safe languages are being used more often, but there are still many legacy systems in production worldwide, new low-level systems that require the use of non-memory safe languages, and web applications that interact with mainframes, IoT devices, firmware, and other systems that may be forced to manage their own memory. Representative CWEs are *CWE-120 Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')* and *CWE-121 Stack-based Buffer Overflow*. +애플리케이션이 메모리를 직접 관리해야 할 때, 실수를 하기 매우 쉽다. 메모리 안전 언어가 더 많이 사용되고 있지만, 전 세계 운영 환경에는 여전히 많은 레거시 시스템이 존재하며, 비메모리 안전 언어의 사용이 필요한 새로운 저수준 시스템과 메인프레임, IoT 장치, 펌웨어 및 자체 메모리를 관리해야 할 수 있는 기타 시스템과 상호작용하는 웹 애플리케이션도 여전히 많다. 대표적인 CWE로는 *CWE-120 입력 크기 확인 없이 버퍼 복사(‘클래식 버퍼 오버플로’)* 및 *CWE-121 스택 기반 버퍼 오버플로*가 있다. -Memory management failures can happen when: +메모리 관리 실패는 다음과 같은 경우에 발생할 수 있다. -* You do not allocate enough memory for a variable -* You do not validate input, causing an overflow of the heap, the stack, a buffer -* You store a data value that is larger than the type of the variable can hold -* You attempt to use unallocated memory or address spaces -* You create off-by-one errors (counting from 1 instead of zero) -* You try to access an object after its been freed -* You use uninitialized variables -* You leak memory or otherwise use up all available memory in error until our application fails +* 변수에 대해 충분한 메모리를 할당하지 않는 경우. +* 입력을 검증하지 않아 힙, 스택 또는 버퍼에서 오버플로가 발생하는 경우. +* 변수 타입이 수용할 수 있는 크기보다 큰 데이터 값을 저장하는 경우. +* 할당되지 않은 메모리 또는 주소 공간을 사용하려고 시도하는 경우. +* 오프 바이 원(off-by-one, 0이 아니라 1부터 카운팅) 오류가 있는 경우. +* 해제(free)된 이후에 객체에 접근하려고 하는 경우. +* 초기화되지 않은 변수를 사용하는 경우. +* 메모리 누수 또는 비정상 메모리 소모로 가용 메모리가 고갈되어 장애로 이어지는 경우. -Memory management failures can lead to failure of the application or even the entire system, see also [X01:2025 Lack of Application Resilience](#x012025-lack-of-application-resilience) +메모리 관리 실패는 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있으며, 이는 [X01:2025 Lack of Application Resilience](#x012025-lack-of-application-resilience)를 함께 참고한다. -### How to prevent. +### 대응 방안. -The best way to prevent memory management failures is to use a memory-safe language. Examples include Rust, Java, Go, C#, Python, Swift, Kotlin, JavaScript, etc. When creating new applications, try hard to convince your organization that it is worth the learning curve to switch to a memory-safe language. If performing a full refactor, push for a rewrite in a memory-safe language when it is possible and feasible. +메모리 관리 실패를 예방하는 최선의 방법은 메모리 안전 언어를 사용하는 것이다. 예로는 Rust, Java, Go, C#, Python, Swift, Kotlin, JavaScript 등이 있다. 새로운 애플리케이션을 개발할 때는 학습 곡선이 있더라도 메모리 안전 언어로 전환할 가치가 있음을 조직 내에서 적극적으로 설득해야 한다. 전면적인 리팩터링을 수행하는 경우에는 가능하고 실현 가능한 범위에서, 메모리 안전 언어로의 재작성을 추진한다. -If you are unable to use a memory-safe language, perform the following: +메모리 안전 언어를 사용할 수 없다면 다음을 수행한다. -* Enable the following server features that make memory management errors harder to exploit: address space layout randomization (ASLR), Data Execution Protection (DEP), and Structured Exception Handling Overwrite Protection (SEHOP). -* Monitor your application for memory leaks. -* Validate all input to your system very carefully, and reject all input that does not meet expectations. -* Study the language you are using and make a list of unsafe and more-safe functions, then share that list with your entire team. If possible, add it to your secure coding guideline or standard. For example, in C, prefer strncpy() over strcpy() and strncat() over strcat(). -* If your language or framework offers memory safety libraries, use them. For example: Safestringlib or SafeStr. -* Use managed buffers and strings rather than raw arrays and pointers whenever possible. -* Take secure coding training that focuses on memory issues and/or your language of choice. Inform your trainer that you are concerned about memory management failures. -* Perform code reviews and/or static analyses. -* Use compiler tools that help with memory management such as StackShield, StackGuard, and Libsafe. -* Perform fuzzing on every input to your system. -* If you have a penetration test performed, inform your tester that you are concerned about memory management failures and that you would like them to pay special attention to this while testing. -* Fix all compiler errors *and* warnings. Do not ignore warnings because your program compiles. -* Ensure your underlying infrastructure is regularly patched, scanned, and hardened. -* Monitor your underlying infrastructure specifically for potential memory vulnerabilities and other failures. -* Consider using [canaries](https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries) to protect your address stack from overflow attacks. +* 메모리 관리 오류의 악용을 어렵게 만드는 서버 기능을 활성화한다: 주소 공간 레이아웃 무작위화(Address Space Layout Randomization, ASLR), 데이터 실행 방지(Data Execution Protection, DEP), 구조화된 예외 처리 덮어쓰기 보호(Structured Exception Handling Overwrite Protection, SEHOP). +* 애플리케이션의 메모리 누수를 모니터링한다. +* 시스템으로 들어오는 모든 입력을 매우 신중하게 검증하고, 기대 조건을 충족하지 않는 입력은 모두 거부한다. +* 사용 중인 언어를 학습하여 위험한 함수와 비교적 안전한 함수의 목록을 작성하고, 이를 팀과 공유한다. 가능하다면 이를 시큐어 코딩 가이드라인이나 표준에 추가한다. 예를 들어, C 언어에서는 strcpy() 대신 strncpy()를, strcat() 대신 strncat()을 우선적으로 사용한다. +* 언어나 프레임워크에서 메모리 안전 라이브러리를 제공한다멵 이를 사용한다. 예: Safestringlib 또는 SafeStr. +* 가능하면 원시 배열과 포인터보다 관리형 버퍼 및 문자열을 사용한다. +* 메모리 이슈 및/또는 사용 언어에 특화된 시큐어 코딩 교육을 수행(수강?)한다. 교육 담당자에게 메모리 관리 실패에 대해 우려하고 있음을 알린다. +* 코드 리뷰 및/또는 정적 분석을 수행한다. +* StackShield, StackGuard, Libsafe 등 메모리 관리를 돕는 컴파일러/도구를 사용한다. +* 시스템의 모든 입력에 대해 퍼징을 수행한다. +* 모의침투 테스트를 수행하는 경우, 테스터에게 메모리 관리 실패에 대한 우려가 있으며 테스트 중 해당 부분에 특별히 주의를 기울여 줄 것을 요청한다. +* 컴파일러 오류뿐 아니라 경고까지 모두 수정한다. 프로그램이 컴파일된다고 해서 경고를 무시하지 않는다. +* 기반 인프라가 정기적으로 패치, 스캔, 하드닝되도록 보장한다. +* 특히 기반 인프라를 대상으로한 잠재적 메모리 취약점 및 기타 장애 요인을 모니터링한다. +* 오버플로 공격으로부터 주소 스택을 보호하기 위해 [카나리(canaries)](https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries) 사용을 고려한다. -### Example attack scenarios. +### 공격 시나리오 예시. -**Scenario #1:** Buffer overflows are the most famous memory vulnerability, a situation where an attacker submits more information into a field than it can accept, such that it overflows the buffer created for the underlying variable. In a successful attack, the overflow characters overwrite the stack pointer, allowing the attacker to insert malicious instructions into your program. +**시나리오 #1:** 버퍼 오버플로는 가장 유명한 메모리 취약점으로, 공격자가 필드가 수용할 수 있는 것보다 더 많은 데이터를 입력하여 해당 변수에 대해 생성된 버퍼를 넘치게 만드는 상황을 말한다. 공격이 성공하면 넘친 데이터가 스택 포인터를 덮어쓰게 되며, 이를 통해 공격자가 프로그램에 악의적인 명령을 삽입할 수 있게 된다. -**Scenario #2:** Use-After-Free (UAF) happens often enough that it’s a semi-common browser bug bounty submission. Imagine a web browser processing JavaScript that manipulates DOM elements. The attacker crafts a JavaScript payload that creates an object (such as a DOM element) and obtains references to it. Through careful manipulation, they trigger the browser to free the object's memory while keeping a dangling pointer to it. Before the browser realizes the memory has been freed, the attacker allocates a new object that occupies the *same* memory space. When the browser tries to use the original pointer, it now points to attacker-controlled data. If this pointer was for a virtual function table, the attacker can redirect code execution to their payload. +**시나리오 #2:** 해제 후 사용(Use-After-Free, UAF)은 비교적 자주 발생하여 브라우저 버그 바운티에서도 준상시적으로 제보되는 유형의 버그다. 예를 들어 웹 브라우저가 DOM 요소를 조작하는 JavaScript를 처리한다고 하자. 공격자는 객체(예: DOM 요소)를 생성하고 그에 대한 참조를 획득하는 JavaScript 페이로드를 만든다. 이후 정교한 조작을 통해, 브라우저가 해당 객체의 메모리를 해제하도록 유도하면서도 그 객체를 가리키는 댕글링 포인터는 유지하게 만든다. 메모리가 해제되었음을 브라우저가 인지하기 전에, 공격자는 *동일한* 메모리 공간을 차지하도록 새 객체를 할당한다. 브라우저가 원래 포인터를 사용하려고 하면, 그 포인터는 이제 공격자가 통제하는 데이터를 가리키게 된다. 만약 이 포인터가 가상 함수 테이블을 가리키는 것이었다면, 공격자는 코드 실행 흐름을 자신의 페이로드로 리다이렉션할 수 있다. -**Scenario #3:** A network service that accepts user input, doesn’t properly validate or sanitize it, then passes it directly to the logging function. The input from the user is passed to the logging function as syslog(user_input) instead of syslog("%s", user_input), which doesn’t specify the format. The attacker sends malicious payloads containing format specifiers such as %x to read stack memory (sensitive data disclosure) or %n to write to memory addresses. By chaining together multiple format specifiers they could map out the stack, locate important addresses, and then overwrite them. This would be a Format string vulnerability (uncontrolled string format). +**시나리오 #3:** 사용자 입력을 받아 적절히 검증하거나 정제하지 않고 로깅 함수로 직접 전달하는 네트워크 서비스를 가정해 보자. 사용자 입력은 형식을 지정하는 syslog("%s", user_input) 대신 형식을 지정하지 않은 syslog(user_input) 형태로 로깅 함수에 전달된다. 공격자는 스택 메모리를 읽기 위한(민감한 데이터 노출) %x 또는 메모리 주소에 값을 쓰기 위한 %n과 같은 형식 지정자(format specifier)를 포함한 악성 페이로드를 전송한다. 공격자는 여러 형식 지정자를 결합하여 스택 구조를 파악하고, 중요한 주소를 찾아낸 뒤 이를 덮어쓸 수 있다. 이는 포맷 스트링 취약점(형식 문자열 취약점?)에 해당한다. -Note: modern browsers use many levels of defenses to defend against such attacks, including [browser sandboxing](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing) ASLR, DEP/NX, RELRO, and PIE. A memory management failure attack on a browser is not a simple attack to carry out. +참고: 현대의 브라우저는 [browser sandboxing](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing), ASLR, DEP/NX, RELRO 및 PIE를 포함하여 이러한 공격을 방어하기 위한 다중 계층의 방어 체계를 사용한다. 브라우저에 대한 메모리 관리 실패 공격은 수행하기에 단순한 공격이 아니다. -### References. +### 참조. * [OWASP community pages: Memory leak,](https://owasp.org/www-community/vulnerabilities/Memory_leak) [Doubly freeing memory,](https://owasp.org/www-community/vulnerabilities/Doubly_freeing_memory) [& Buffer Overflow](https://owasp.org/www-community/vulnerabilities/Buffer_Overflow) * [Awesome Fuzzing: a list of fuzzing resources](https://github.com/secfigo/Awesome-Fuzzing) * [Project Zero Blog](https://googleprojectzero.blogspot.com) * [Microsoft MSRC Blog](https://www.microsoft.com/en-us/msrc/blog) -### List of Mapped CWEs +### 해당되는 CWE 목록. * [CWE-14 Compiler Removal of Code to Clear Buffers](https://cwe.mitre.org/data/definitions/14.html) * [CWE-119 Improper Restriction of Operations within the Bounds of a Memory Buffer](https://cwe.mitre.org/data/definitions/119.html) * [CWE-120 Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')](https://cwe.mitre.org/data/definitions/120.html) @@ -285,40 +285,40 @@ Note: modern browsers use many levels of defenses to defend against such attacks -## X03:2025 Inappropriate Trust in AI Generated Code ('Vibe Coding') +## X03:2025 AI 생성 코드에 대한 부적절한 신뢰(‘바이브 코딩’, ‘Vibe Coding’) -### Background. +### 배경. -Currently the entire world is talking about and using AI, and this includes software developers. Although there are currently no CVEs or CWEs related to AI generated code, it is well known and documented that AI generated code often contains more vulnerabilities than code written by human beings. +현재 전 세계가 AI 사용에 대해 이야기하고 사용하고 있으며, 여기에는 소프트웨어 개발자도 포함된다. 현재로서는 AI 생성 코드와 직접적으로 관련된 CVE나 CWE는 없지만, AI 생성 코드가 인간이 작성한 코드보다 더 많은 취약점을 포함하는 경우가 많다는 사실은 널리 알려져 있으며 문서로도 입증되어 있다. -### Description. +### 설명. -We are seeing software development practices change to include not only code written with the assistance of AI, but code written and committed almost entirely without human oversight (often referred to as vibe coding). Just as it was never a good idea to copy code snippets from blogs or websites without thinking twice, the problem is exacerbated in this case. Good, secure code snippets were and are rare and might be statistically neglected by AI due to system constraints. +우리는 소프트웨어 개발 관행이 변화하여, AI의 도움을 받아 작성한 코드뿐 아니라 사람의 검토 없이 거의 전적으로 작성되어 그대로 커밋되는 코드(흔히 ‘바이브 코딩(vibe coding)’이라 불림)까지 포함하는 흐름을 보고 있다. 예전에도 블로그나 웹사이트의 코드 스니펫을 깊이 생각하지 않고 복사하는 것이 결코 바람직하지 않았던 것과 마찬가지로, 이 경우에는 문제가 더 악화된다. 안전하고 좋은 코드 스니펫은 예나 지금이나 드물며, 시스템 제약으로 인해 AI가 통계적으로 그러한 좋은 예시를 충분히 반영하지 못할 수도 있다. -### How to prevent. -We urge all people who write code to consider the following when using AI: +### 대응 방안. +AI를 활용해 코드를 작성하는 모든 사람에게 다음 사항을 고려할 것을 권고한다. -* You should be able to read and fully understand all code you submit, even if it is written by an AI or copied from an online forum. You are responsible for all code that you commit. -* You should review all AI-assisted code thoroughly for vulnerabilities, ideally with your own eyes and also with security tooling made for this purpose (such as static analysis). Consider using classic code review techniques as described in [OWASP Cheat Sheet Series: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html). -* Ideally, write your own code, let the AI suggest improvements, check the AI's code, and let the AI make corrections until you are satisfied with the result. -* Consider using a Retrieval Augmented Generation (RAG) server with your own collected and reviewed secure code samples and documentation, such as your organization’s security coding guideline, standard, or policy, and have the RAG server enforce any policies or standards. -* Consider purchasing tooling that implements guardrails for privacy and security for use with your AI(s) of choice. -* Consider purchasing a private AI, ideally with a contract agreement (including a privacy agreement) that the AI is not to be trained on your organization’s data, queries, code or any other sensitive information. -* Consider implementing an Model Context Protocol (MCP) server in-between your IDE and AI, then set it up to enforce the use of your security tooling of choice. -* Implement policies and processes as part of your SDLC to inform developers (and all employees) of how they should and should not use AI within your organization. -* Create a list of good and effective prompts, that take IT security best practices into account. Ideally they should also consider your internal secure coding guidelines. Developers can use this prompts as a starting point for their programs. -* AI is likely to become part of each phase of your system development life cycle, both how to use it effectively and safely. Use it wisely. -* Actually it is **not** recommended to use vibe coding for complex functions, business critical programs, or programs that are used for a long time. -* Implement technical checks and safeguards against the use of Shadow AI. -* Train your developers on your policies, as well as safe AI usage and best practices for using AI in software development. +* AI가 작성했거나 온라인 포럼에서 복사한 코드일지라도, 제출하는 모든 코드를 읽고 완전히 이해할 수 있어야 한다. 커밋하는 모든 코드에 대한 책임은 본인에게 있다. +* 모든 AI 지원 코드를 취약점 관점에서 철저히 검토해야 하며, 이상적으로는 직접 육안으로 확인하고 목적에 맞게 제작된 (정적 분석 같은) 보안 도구를 병행해야 한다. [OWASP Cheat Sheet Series: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html)에 기술된 전통적인 코드 리뷰 기법의 사용을 고려한다. +* 이상적으로는 직접 코드를 작성하고, AI가 개선안을 제시하게 한 뒤, 제안된 코드를 검증하고, 결과에 만족할 때까지 AI가 수정을 하도록 한다. +* 조직의 보안 코딩 가이드라인/표준/정책 등과 같이, 자체적으로 수집, 검토한 안전한 코드 샘플과 문서를 기반으로 하는 RAG(Retrieval Augmented Generation) 서버 사용을 고려한다. 또한 RAG 서버가 정책이나 표준을 강제하도록 한다. +* 선택한 AI와 함께 사용할 수 있도록, 개인정보 보호와 보안을 위한 가드레일 구현 도구를 구매하는 방안을 고려하라. +* 사설(private) AI의 구매를 고려하며, 이상적으로는 조직의 데이터, 쿼리, 코드 또는 기타 민감한 정보로 AI를 학습시키지 않는다는 계약(개인정보 보호 협약 포함)을 체결한다. +* IDE과 AI 사이에 모델 컨텍스트 프로토콜(Model Context Protocol, MCP) 서버를 구축하고, 선택한 보안 도구의 사용을 강제하도록 설정하는 것을 고려한다. +* 개발자(및 전 직원)에게 조직 내에서 AI를 어떻게 사용해야 하고 사용하지 말아야 하는지 안내하기 위해, 소프트웨어 개발 생명 주기(Software Development Life Cycle, SDLC)의 일부로 정책과 프로세스를 수립한다. +* IT 보안 모범 사례를 반영한, 유용(우수?)하고 효과적인 프롬프트 목록을 작성한다. 이상적으로는 내부 시큐어 코딩 가이드라인도 반영해야 한다. 개발자는 해당 프롬프트를 프로그램 개발의 출발점으로 사용할 수 있다. +* AI는 시스템 개발 생명 주기의 각 단계에 포함될 가능성이 높으므로, 이를 효과적이고 안전하게 사용하는 것이 중요하다. 이를 지혜롭게 사용해야 한다. +* 실제로 복잡한 함수, 비즈니스 핵심(business critical) 프로그램, 또는 장기간 사용되는 프로그램에는 바이브 코딩(vibe coding)을 사용하는 것을 권장하지 **않는다**. +* 섀도우 AI(Shadow AI) 사용에 대한 기술적 점검과 보호 조치를 구현한다. +* 개발자에게 조직의 정책뿐만 아니라, 안전한 AI 사용 및 소프트웨어 개발에서의 AI 활용 모범 사례에 대한 교육을 실시한다. -### References. +### 참조. * [OWASP Cheat Sheet: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html) -### List of Mapped CWEs +### 해당되는 CWE 목록. -none- From d4a53eeb9284323e319c82f62478cbd4489ae327 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Mon, 5 Jan 2026 05:55:54 +0900 Subject: [PATCH 090/167] =?UTF-8?q?=EB=AC=B8=EC=B2=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2025/docs/ko/X01_2025-Next_Steps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index ec3f9ad95..03e8d49c6 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -304,7 +304,7 @@ AI를 활용해 코드를 작성하는 모든 사람에게 다음 사항을 고 * 모든 AI 지원 코드를 취약점 관점에서 철저히 검토해야 하며, 이상적으로는 직접 육안으로 확인하고 목적에 맞게 제작된 (정적 분석 같은) 보안 도구를 병행해야 한다. [OWASP Cheat Sheet Series: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html)에 기술된 전통적인 코드 리뷰 기법의 사용을 고려한다. * 이상적으로는 직접 코드를 작성하고, AI가 개선안을 제시하게 한 뒤, 제안된 코드를 검증하고, 결과에 만족할 때까지 AI가 수정을 하도록 한다. * 조직의 보안 코딩 가이드라인/표준/정책 등과 같이, 자체적으로 수집, 검토한 안전한 코드 샘플과 문서를 기반으로 하는 RAG(Retrieval Augmented Generation) 서버 사용을 고려한다. 또한 RAG 서버가 정책이나 표준을 강제하도록 한다. -* 선택한 AI와 함께 사용할 수 있도록, 개인정보 보호와 보안을 위한 가드레일 구현 도구를 구매하는 방안을 고려하라. +* 선택한 AI와 함께 사용할 수 있도록, 개인정보 보호와 보안을 위한 가드레일 구현 도구를 구매하는 방안을 고려한다. * 사설(private) AI의 구매를 고려하며, 이상적으로는 조직의 데이터, 쿼리, 코드 또는 기타 민감한 정보로 AI를 학습시키지 않는다는 계약(개인정보 보호 협약 포함)을 체결한다. * IDE과 AI 사이에 모델 컨텍스트 프로토콜(Model Context Protocol, MCP) 서버를 구축하고, 선택한 보안 도구의 사용을 강제하도록 설정하는 것을 고려한다. * 개발자(및 전 직원)에게 조직 내에서 AI를 어떻게 사용해야 하고 사용하지 말아야 하는지 안내하기 위해, 소프트웨어 개발 생명 주기(Software Development Life Cycle, SDLC)의 일부로 정책과 프로세스를 수립한다. From b5c7f060f5bf3d56d2be5d94f190c1ded35915ad Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Mon, 5 Jan 2026 05:57:29 +0900 Subject: [PATCH 091/167] =?UTF-8?q?=EB=AC=B8=EC=B2=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2025/docs/ko/X01_2025-Next_Steps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index 03e8d49c6..a5ff337b1 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -304,7 +304,7 @@ AI를 활용해 코드를 작성하는 모든 사람에게 다음 사항을 고 * 모든 AI 지원 코드를 취약점 관점에서 철저히 검토해야 하며, 이상적으로는 직접 육안으로 확인하고 목적에 맞게 제작된 (정적 분석 같은) 보안 도구를 병행해야 한다. [OWASP Cheat Sheet Series: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html)에 기술된 전통적인 코드 리뷰 기법의 사용을 고려한다. * 이상적으로는 직접 코드를 작성하고, AI가 개선안을 제시하게 한 뒤, 제안된 코드를 검증하고, 결과에 만족할 때까지 AI가 수정을 하도록 한다. * 조직의 보안 코딩 가이드라인/표준/정책 등과 같이, 자체적으로 수집, 검토한 안전한 코드 샘플과 문서를 기반으로 하는 RAG(Retrieval Augmented Generation) 서버 사용을 고려한다. 또한 RAG 서버가 정책이나 표준을 강제하도록 한다. -* 선택한 AI와 함께 사용할 수 있도록, 개인정보 보호와 보안을 위한 가드레일 구현 도구를 구매하는 방안을 고려한다. +* 선택한 AI와 함께 사용할 수 있도록, 개인정보 보호와 보안을 위한 가드레일 구현 도구를 구매하는 방안을 고려해야 한다. * 사설(private) AI의 구매를 고려하며, 이상적으로는 조직의 데이터, 쿼리, 코드 또는 기타 민감한 정보로 AI를 학습시키지 않는다는 계약(개인정보 보호 협약 포함)을 체결한다. * IDE과 AI 사이에 모델 컨텍스트 프로토콜(Model Context Protocol, MCP) 서버를 구축하고, 선택한 보안 도구의 사용을 강제하도록 설정하는 것을 고려한다. * 개발자(및 전 직원)에게 조직 내에서 AI를 어떻게 사용해야 하고 사용하지 말아야 하는지 안내하기 위해, 소프트웨어 개발 생명 주기(Software Development Life Cycle, SDLC)의 일부로 정책과 프로세스를 수립한다. From ebd7e841972d78d4140e652946a3f4a6f7167cf8 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Mon, 5 Jan 2026 21:21:57 +0900 Subject: [PATCH 092/167] Review reflect --- ...5-Mishandling_of_Exceptional_Conditions.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index ed8998629..f44f71095 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -1,15 +1,17 @@ -# A10:2025 부적절한 예외 처리 - -![icon](../assets/TOP_10_Icons_Final_Mishandling_of_Exceptional_Conditions.png){: style="height:80px;width:80px" align="right"} +# A10:2025 부적절한 예외 처리 ![icon](../assets/TOP_10_Icons_Final_Mishandling_of_Exceptional_Conditions.png){: style="height:80px;width:80px" align="right"} ## 배경. 부적절한 예외 처리는 2025년에 신설된 카테고리다. 이 카테고리는 24개의 CWE를 포함하며, 부적절한 오류 처리, 논리적 오류, 안전하지 않은 실패(Failing Open), 그 외 시스템이 비정상적인 상황에서 마주할 수 있는 시나리오를 다룬다. 이 카테고리에는 이전에 "코드 품질 저하"와 연관되었던 일부 CWE가 포함되어 있다. 기존 분류는 너무 광범위했으며, 이처럼 구체적인 카테고리가 더 명확한 가이드를 제공한다고 판단했다. -대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족에 대한 부적절한 처리*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 안전하지 않은 실패(Failing Open)*가 있다. +## 배경. + +부적절한 예외 처리는 2025년에 신설된 카테고리다. 이 카테고리는 24개의 CWE를 포함하며, 부적절한 오류 처리, 논리적 오류, 페일 오픈(fail open), 그 외 시스템이 비정상적인 상황에서 마주할 수 있는 시나리오를 다룬다. 이 카테고리에는 이전에 낮은 코드 품질과 연관되었던 일부 CWE가 포함되어 있다. 기존의 낮은 코드 품질 카테고리는 너무 광범위했기에, 부적절한 예외 처리라는 구체적인 카테고리로 분리하여 더 명확한 가이드를 제공하고자 했다. +대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족에 대한 부적절한 처리*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 안전하지 않은 실패('Failing Open')*가 있다. -## Score table. + +## 점수표.
CWEs Mapped + 해당되는 CWE 개수 Max Incidence Rate + 최대 취약점 발생률 Avg Incidence Rate + 평균 취약점 발생률 Max Coverage + 최대 테스트 커버리지 Avg Coverage + 평균 테스트 커버리지 Avg Weighted Exploit + 평균 가중 악용도 Avg Weighted Impact + 평균 가중 영향도 Total Occurrences + 총 발생 건수 Total CVEs + 총 CVE 건수
@@ -24,9 +26,9 @@ - - @@ -61,23 +63,21 @@ 부적절한 예외 처리는 프로그램이 비정상적이고 예측 불가능한 상황을 예방, 탐지, 대응하지 못할 때 발생하며, 이로 인해 시스템 충돌, 예상치 못한 동작, 때로는 보안 취약점까지 초래할 수 있다. 이는 다음 세 가지 실패 중 하나 이상을 포함한다. 비정상적인 상황을 사전에 예방하지 못하거나, 발생 시 이를 식별하지 못하거나, 발생 후 적절히 대응하지 못하는 경우다. -예외 상황은 다음과 같은 원인으로 발생할 수 있다. 누락되거나 불완전한 입력 검증, 발생 지점이 아닌 상위 레벨에서의 지연된 오류 처리, 메모리·권한·네트워크 문제 등 예기치 않은 환경 상태, 일관성 없는 예외 처리, 또는 전혀 처리되지 않는 예외로 인해 시스템이 알 수 없고 예측 불가능한 상태에 빠지는 경우다. 애플리케이션이 다음에 무엇을 해야 할지 알 수 없는 상태에 빠진다면, 예외 처리가 실패한 것이다. 이러한 오류와 예외는 발견이 어려워 장기간 보안을 위협할 수 있다. +예외 상황은 다음과 같은 원인으로 발생할 수 있다. 누락되거나 불완전한 입력 검증, 발생 지점이 아닌 상위 레벨에서의 지연된 오류 처리, 메모리,권한,네트워크 문제 등 예기치 않은 환경 상태, 일관성 없는 예외 처리, 또는 전혀 처리되지 않는 예외로 인해 시스템이 알 수 없고 예측 불가능한 상태에 빠지는 경우다. 애플리케이션이 다음에 무엇을 해야 할지 알 수 없는 상태에 빠진다면, 예외 처리가 실패한 것이다. 이러한 오류와 예외는 발견이 어려워 장기간 보안을 위협할 수 있다. -부적절한 예외 처리로 인해 다양한 보안 취약점이 발생할 수 있다. 예를 들어 논리 버그, 오버플로우, 레이스 컨디션, 부정 거래, 메모리·상태·리소스·타이밍·인증·인가 관련 문제 등이 있다. 이러한 유형의 취약점은 시스템 또는 데이터의 기밀성, 가용성, 무결성에 부정적인 영향을 미칠 수 있다. 공격자는 애플리케이션의 결함 있는 오류 처리를 악용하여 이 취약점을 공격한다. +부적절한 예외 처리로 인해 다양한 보안 취약점이 발생할 수 있다. 예를 들어 논리 버그, 오버플로우, 레이스 컨디션, 부정 거래, 메모리,상태,리소스,타이밍,인증,인가 관련 문제 등이 있다. 이러한 유형의 취약점은 시스템 또는 데이터의 기밀성, 가용성, 무결성에 부정적인 영향을 미칠 수 있다. 공격자는 애플리케이션의 결함 있는 오류 처리를 악용하여 이 취약점을 공격한다. ## 대응 방안. -## 대응 방안 - -예외 상황을 적절히 처리하려면 이러한 상황에 대비한 계획을 세워야 한다(최악의 상황을 예상하라). 모든 시스템 오류를 발생 지점에서 직접 캐치(catch)하고, 이를 처리해야 한다. 여기서 처리란 문제 해결을 위한 의미 있는 조치를 취하고 정상 상태로 복구하는 것을 의미한다. 처리 과정에는 오류 발생 시 사용자에게 이해하기 쉬운 방식으로 알리고, 이벤트를 로깅하며, 필요하다고 판단되면 알림을 발송하는 것이 포함되어야 한다. 또한 놓친 예외가 있을 경우를 대비해 전역 예외 핸들러(Global Exception Handler)를 구현해야 한다. 이상적으로는 반복되는 오류나 진행 중인 공격을 나타내는 패턴을 감시하고, 이에 대응·방어·차단할 수 있는 모니터링 또는 옵저버빌리티 도구를 갖추는 것이 좋다. 이를 통해 오류 처리 취약점을 악용하는 스크립트와 봇에 대응하고 차단할 수 있다. +예외 상황을 적절히 처리하려면 이러한 상황에 대비한 계획을 세워야 한다(최악의 상황을 예상하라). 모든 시스템 오류를 발생 지점에서 직접 캐치(catch)하고, 이를 처리해야 한다. 여기서 처리란 문제 해결을 위한 의미 있는 조치를 취하고 정상 상태로 복구하는 것을 의미한다. 처리 과정에는 오류 발생 시 사용자에게 이해하기 쉬운 방식으로 알리고, 이벤트를 로깅하며, 필요하다고 판단되면 알림을 발송하는 것이 포함되어야 한다. 또한 놓친 예외가 있을 경우를 대비해 전역 예외 핸들러(Global Exception Handler)를 구현해야 한다. 이상적으로는 반복되는 오류나 진행 중인 공격을 나타내는 패턴을 감시하고, 이에 대응,방어,차단할 수 있는 모니터링 또는 옵저버빌리티 도구를 갖추는 것이 좋다. 이를 통해 오류 처리 취약점을 악용하는 스크립트와 봇에 대응하고 차단할 수 있다. -예외 상황을 캐치하고 처리하면 프로그램의 기반 인프라가 예측 불가능한 상황에 노출되는 것을 방지할 수 있다. 트랜잭션 처리 도중이라면, 트랜잭션의 모든 부분을 롤백하고 처음부터 다시 시작하는 것이 매우 중요하다(이를 안전한 실패[Failing Closed]라고 한다). 트랜잭션을 중간 상태에서 복구하려는 시도는 종종 복구 불가능한 오류를 만들어낸다. +예외 상황을 캐치하고 처리하면 프로그램의 기반 인프라가 예측 불가능한 상황에 노출되는 것을 방지할 수 있다. 트랜잭션 처리 도중이라면, 트랜잭션의 모든 부분을 롤백하고 처음부터 다시 시작하는 것이 매우 중요하다(이를 fail closed라고 한다). 트랜잭션을 중간 상태에서 복구하려는 시도는 종종 복구 불가능한 오류를 만들어낸다. -가능하다면 속도 제한(Rate Limiting), 리소스 쿼터, 스로틀링 등 다양한 제한을 적용하여 애초에 예외 상황이 발생하지 않도록 예방하라. 정보 기술에서 무제한이어야 하는 것은 없다. 제한이 없으면 애플리케이션 복원력 저하, 서비스 거부(DoS), 무차별 대입 공격 성공, 과도한 클라우드 비용 등의 문제가 발생할 수 있다. +가능하다면 속도 제한(rate limit), 리소스 쿼터, 스로틀링 등 다양한 제한을 적용하여 애초에 예외 상황이 발생하지 않도록 예방하라. 정보기술 분야에서 무제한이어야 하는 것은 없다. 제한이 없으면 애플리케이션 복원력 저하, 서비스 거부(DoS), 무차별 대입 공격 성공, 과도한 클라우드 비용 등의 문제가 발생할 수 있다. 특정 빈도 이상으로 동일한 오류가 반복될 경우, 개별 오류 메시지 대신 발생 횟수와 시간대를 보여주는 통계 형태로 출력하는 것을 고려하라. 이 정보는 자동화된 로깅 및 모니터링을 방해하지 않도록 원본 메시지에 추가하는 방식으로 처리해야 한다. [A09:2025 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)를 참고하라. -이 외에도 다음 사항을 포함해야 한다: 엄격한 입력 검증(허용해야 하는 위험 문자에 대한 새니타이징 또는 이스케이프 처리 포함), 중앙 집중화된 오류 처리·로깅·모니터링·알림 체계, 그리고 전역 예외 핸들러다. 하나의 애플리케이션에서 예외 처리를 위한 여러 함수를 두어서는 안 되며, 한 곳에서 동일한 방식으로 처리해야 한다. 또한 이 섹션의 모든 권고 사항에 대해 프로젝트 보안 요구사항을 수립하고, 설계 단계에서 위협 모델링 또는 보안 설계 검토를 수행하며, 코드 리뷰나 정적 분석을 실시하고, 최종 시스템에 대해 스트레스·성능·침투 테스트를 수행해야 한다. +이 외에도 다음 사항을 포함해야 한다. 엄격한 입력 검증(허용해야 하는 위험 문자에 대한 새니타이징 또는 이스케이프 처리 포함), *중앙 집중화된* 오류 처리,로깅,모니터링,알림 체계, 그리고 전역 예외 핸들러다. 하나의 애플리케이션에서 예외 처리를 위한 여러 함수를 두어서는 안 되며, 한 곳에서 동일한 방식으로 처리해야 한다. 또한 이 섹션의 모든 권고 사항에 대해 프로젝트 보안 요구사항을 수립하고, 설계 단계에서 위협 모델링 또는 보안 설계 검토를 수행하며, 코드 리뷰나 정적 분석을 실시하고, 최종 시스템에 대해 스트레스,성능,침투 테스트를 수행해야 한다. 가능하다면 조직 전체가 동일한 방식으로 예외 상황을 처리하는 것이 좋다. 이렇게 하면 이 중요한 보안 통제에 대한 코드 리뷰와 감사가 더 쉬워진다. @@ -87,7 +87,7 @@ **시나리오 2:** 데이터베이스 오류가 사용자에게 그대로 노출되면 민감한 시스템 정보가 유출된다. 공격자는 이를 악용해 의도적으로 오류를 유발하고, 수집한 정보를 기반으로 더 정교한 SQL 인젝션 공격을 구성할 수 있다. -**시나리오 3:** 공격자가 네트워크 중단을 일으켜 다단계 금융 트랜잭션을 방해할 수 있다. 예를 들어 트랜잭션이 "출금 → 입금 → 로깅" 순서로 처리될 때, 중간에 오류가 발생해도 시스템이 전체를 롤백(안전한 실패)하지 않으면 문제가 생긴다. 공격자는 이를 악용해 사용자 계좌에서 돈만 빠져나가게 하거나, 레이스 컨디션을 이용해 대상 계좌로 여러 번 송금할 수 있다. +**시나리오 3:** 공격자가 네트워크 장애를 일으켜 여러 단계로 이루어진 트랜젝션을 중간에 방해할 수 있다. 예를 들어 트랜잭션이 사용자 계좌 출금, 대상 계좌 입금, 트랜잭션 로깅 순서로 처리된다고 가정한다면, 중간에 오류가 발생해도 시스템이 전체를 롤백(안전한 실패)하지 않으할 문제가 생긴다. 공격자는 이를 악용해 사용자 계좌에서 돈만 빠져나가게 하거나, 레이스 컨디션을 이용해 대상 계좌로 여러 번 송금할 수 있다. ## 참조. @@ -109,7 +109,7 @@ * [Example of real-world mishandling of an exceptional condition](https://www.firstreference.com/blog/human-error-and-internal-control-failures-cause-us62m-fine/) -## List of Mapped CWEs +## 해당되는 CWE 목록. * [CWE-209 Generation of Error Message Containing Sensitive Information](https://cwe.mitre.org/data/definitions/209.html) * [CWE-215 Insertion of Sensitive Information Into Debugging Code](https://cwe.mitre.org/data/definitions/215.html) * [CWE-234 Failure to Handle Missing Parameter](https://cwe.mitre.org/data/definitions/234.html) From bc1705fac658f78d54db51efbc25e62e3ce5b002 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Mon, 5 Jan 2026 21:34:21 +0900 Subject: [PATCH 093/167] CWE-636 translation change --- 2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index f44f71095..51373f6b7 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -8,7 +8,7 @@ 부적절한 예외 처리는 2025년에 신설된 카테고리다. 이 카테고리는 24개의 CWE를 포함하며, 부적절한 오류 처리, 논리적 오류, 페일 오픈(fail open), 그 외 시스템이 비정상적인 상황에서 마주할 수 있는 시나리오를 다룬다. 이 카테고리에는 이전에 낮은 코드 품질과 연관되었던 일부 CWE가 포함되어 있다. 기존의 낮은 코드 품질 카테고리는 너무 광범위했기에, 부적절한 예외 처리라는 구체적인 카테고리로 분리하여 더 명확한 가이드를 제공하고자 했다. -대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족에 대한 부적절한 처리*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 안전하지 않은 실패('Failing Open')*가 있다. +대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족에 대한 부적절한 처리*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 취약한 실패 처리('Failing Open')*가 있다. ## 점수표. From 69bac8b64f8adf932364d5b0f919a5978e2bcfdd Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Mon, 5 Jan 2026 23:45:10 +0900 Subject: [PATCH 094/167] Update A04_2025-Cryptographic_Failures.md --- .../ko/A04_2025-Cryptographic_Failures.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 7c76bacba..4f8f89ab0 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -1,10 +1,10 @@ -# A04:2025 암호학적 실패 ![icon](../assets/TOP_10_Icons_Final_Crypto_Failures.png){: style="height:80px;width:80px" align="right"} +# A04:2025 암호 체계 실패 ![icon](../assets/TOP_10_Icons_Final_Crypto_Failures.png){: style="height:80px;width:80px" align="right"} ## 배경. -2단계 하락해 4위에 유지하고 있다. 이번 카테고리는 암호화 부재, 불충분하게 강한 암호화, 약한 암호화키 그리고 에러와 관련된 실패에 중점을 둔다. 해당 카테고리에 포함된 3개의 CWE는 약한 의사 난수 생성기(PRNG)와 관련되어 있다. `CWE-327: 위험하고 실패한 암호화 알고리즘`, `CWE-331: 불충분한 엔트로피`, `CWE-1241: 난수 생성기 내 예측 가능한 알고리즘`, `CWE-338: 암호학적 약한 의사난수 생성기(PRNG) 사용` +암호 체계 실패 카테고리는 이전 버전에서 2단계 하락해 4위가 되었다. 이번 카테고리는 암호화 부재, 불충분하게 강한 암호화, 약한 암호화키 그리고 에러와 관련된 실패에 중점을 둔다. 해당 카테고리에 포함된 가장 흔하게 발생되는 3개의 CWE는 약한 의사 난수 생성기(PRNG)와 관련되어 있다. *CWE-327: 위험하거나 취약한 암호화 알고리즘 사용*, *CWE-331: 불충분한 엔트로피*, *CWE-1241: 난수 생성기 내 예측 가능한 알고리즘 사용*, *CWE-338: 암호학적 약한 의사난수 생성기(PRNG) 사용* @@ -58,22 +58,23 @@ ## 설명. -흔히 말하기를, [전송 계층]((https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 내 모든 데이터는 암호화되어 전송되어야 한다고 한다. 이전 장벽으로 CPU 성능, 프라이빗 키/인증서 관리가 있었으나, 지금은 CPU 명령어 셋이 정확한 암호화를(예시: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 위해 설계되었고, 프라이빗 키와 인정서 관리는 [LetsEncrypt.org](https://LetsEncrypt.org) 같은 서비스나 큰 클라우드 벤더들이 특정 플랫폼을 위한 통합된 인증서 관리 서비스를 제공하여 관리하기 쉬워졌다. +흔히 말하기를, [전송 계층]((https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 내 모든 데이터는 암호화되어 전송되어야 한다고 한다. 이전 장벽으로 CPU 성능 문제, 프라이빗 키/인증서 관리 문제가 있었으나, 지금은 암호화 가속을 위한 CPU 전용 명령어(예: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 로 문제 해결되었으며, 프라이빗 키와 인증서 관리는 [LetsEncrypt.org](https://LetsEncrypt.org) 같은 서비스나 대형 클라우드 공급업체가 특정 플랫폼을 위한 통합된 인증서 관리 서비스를 제공하여 관리하기 쉬워졌다. -전송 계층 보안 외에도 어떤 저장된 데이터에 암호화가 필요한지 결정하는 것과 전송 중 ([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer) 내, OSI 7계층)에도 추가적인 암호화가 필요한지 결정하는 것도 중요하다. 예시로, 패스워드, 신용 카드 번호, 건강 정보, 개인 정보 그리고 비즈니스 기밀 자료는 추가적 보호가 요구된다. 특히 해당 데이터가 개인정보 법률 (예시, GDPR, PCI DSS)에 명시된 경우 더욱 그렇다. -해당 데이터들을 위해선 다음과 같은 사항들이 해당되는지 검토하여야 한다. +전송 계층 보안 외에도 어떤 데이터가 암호화 필요한지와 전송 중 ([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer) 내, OSI 7계층)에도 추가적인 암호화가 필요한지 결정하는 것도 중요하다. 예시로, 패스워드, 신용 카드 번호, 건강 정보, 개인 정보 그리고 비즈니스 기밀 자료는 추가적 보호가 요구된다. 특히 해당 데이터가 개인정보 법률 (예: GDPR, PCI DSS)에 적용 대상인 경우 더욱 그렇다. +해당 데이터들을 위해선 다음과 같은 사항들을 검토하여야 한다. -* 약하거나 오래된 암호화 알고리즘이나 프로토콜이 기본 값으로 또는 예전 코드에 사용되는가? -* 기본 암호키가 사용되는가, 약한 암호키가 생성되었는가, 같은 키가 반복적으로 사용되는가, 적절한 키 관리 시스템이나 키 변경 주기가 있는가? +* 약하거나 오래된 암호화 알고리즘, 프로토콜이 기본 값으로 사용되거나 예전 코드에서 사용되고 있는가? +* 기본값으로 설정된 암호키가 사용되는가, 약한 암호키가 생성되었는가, 같은 키가 반복적으로 사용되는가, 적절한 키 관리 시스템이나 키 변경 주기가 없지는 않은가? * 사용되는 암호키가 소스코드 저장소 내 존재하는가? -* 암호화가 강제되는가? (예시. HTTP 헤더 보안 지시자 또는 헤더 존재 여부) +* 암호화가 강제되는가? (예: HTTP 헤더 보안 지시문 또는 헤더 존재 여부) * 수신한 서버 인증서와 신뢰 체인이 적절히 검증되었는가? -* 초기 벡터가 무시되거나, 재사용되거나 또는 운영 암호화 모드를 위한 충분한 초기 벡터가 생성되었는가? ECB 같은 안전하지 않은 운영 모드를 사용하는가? 인증된 적절한 암호화가 존재하는데 단순한 암호화를 사용하지는 않는가? +* 초기 벡터가 무시되거나, 재사용되거나 또는 운영 암호화 모드를 위한 충분한 초기 벡터가 생성되었는가? ECB 같은 안전하지 않은 운영 모드를 사용하는가? 인증된 암호화 알고리즘이 더 적절한 상황에서 단순한 암호화 알고리즘을 사용하지는 않는가? * 패스워드 기반 키 유도 함수가 없는 상태에서 패스워드가 암호키로써 사용되는가? * 암호화 요구사항에 충족하지 않는 난수를 사용하는가? 만약 올바른 함수를 선택하더라도 개발자가 시드를 선택해야 하는가? 만일 아니라면, 개발자가 충분한 엔트로피/예측 불가능성이 부족한 시드로 강한 시드 기능을 덮어쓰지는 않았는가? * MD5, SHA1 같은 더 이상 사용하지 않는 해시 함수를 사용하고 있거나 또는 암호학적 해시 함수가 필요할 때 비암호학적 해시 함수를 사용하는가? +* 암호화 오류 메시지나 사이드 채널 정보가 패딩 오라클 공격 등으로 악용될 수 있는가? * 암호화 알고리즘이 다운 그레이드 되거나 우회 가능한가? 레퍼런스 참고 ASVS: Cryptography (V11), Secure Communication (V12) and Data Protection (V14). @@ -93,26 +94,25 @@ * 강한 표준 알고리즘, 프로토콜, 키가 최신 인지 확인하고 적절한 키 관리 시스템을 이용해라. * 모든 데이터는 전달 시 전방향 보안(Forward secrecy), 암호 블록 체인(Cipher block chaining)에 대한 지원을 중단하고, 퀀텀 키 변경 알고리즘을 지원하는 TLS 1.2 버전 이상에서 암호화 되어야 한다. HTTP 스트릭 전송 보안(HTTP Strict Transport Security, HSTS) 을 이용해 HTTPS 강제 암호화를 하여야 한다. 모든 것을 도구를 이용해 검사하라. * 민감 데이터가 들어있는 응답 값 캐싱을 비활성화한다. 이는 콘텐츠 전송 네트워크(CDN), 웹 서버 내 캐싱과 모든 애플리케이션 캐싱을 포함한다. (예시. 레디스(Redis)) -* 매번의 데이터 분류 작업에서 요구된 보안 통제를 적용하라. -* FTP 나 STARTTLS 같은 암호화되지 않은 프로토콜을 사용하지 마라. 기밀 정보 전달에 SMTP 사용을 피해라. +* 매번의 데이터 분류 시 요구되는 보안 통제를 적용하라. +* FTP 나 STARTTLS 같은 암호화되지 않는 프로토콜을 사용하지 마라. 기밀 정보 전달에 메일(SMTP) 사용을 피해라. * 아라곤2(Argon2), 예스크립트(yescrypt, 스크립트(scrypt) 또는 PBKDF2-HMAC-SHA-512 같은 작업 인자(지연 인자라고도 함)과 강한 적응력(Adaptive)이 강구된 솔트 해싱 함수를 사용하라. 레거시 시스템을 위해 비크립트(bcrypt) 이용 시 [OWASP Cheat Sheet: Password Storage](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) 을 참고하라. \* 적응력: 시간이 갈 수록 레인보우 테이블 생성에 많은 리소스가 사용되게 하는 능력 \* 작업 인자: 계산 횟수를 증가시키는 것과 같이 해시 과정을 복잡하게 만드는 인자 -* ////쑤쩡 초기화 벡터(IV)는 운영 모드에 따라 적절하게 선택되어야 하며, 이는 암호화적 보안 의사난수 생성기(cryptographically secure pseudo random number generator, CSPRNG) 사용을 의미할 수 있다. 해당 모드는 넌스값을 요구하며, 초기화 벡터는 CSPRNG가 필요하지 않다. 모든 케이스에서 초기화 벡터는 수정된 키에서 두번 이상 사용되지 않았다./// -* 일반 암호화보단 인증된 암호화를 사용해라. +* 초기화 벡터(IV)는 운영 모드에 따라 적절하게 선택되어야 하며, 이는 암호화적 보안 의사난수 생성기(cryptographically secure pseudo random number generator, CSPRNG) 사용을 의미할 수 있다. 넌스를 요구하는 모드인 경우 CSPRNG를 이용해 초기화 벡터 생성할 필요는 없다. 다만, 초기화 벡터 사용 시 고정키에 두 번 이상 사용되지 않아야 한다. +* 단순 암호화 알고리즘보단 인증된 암호화 알고리즘을 사용해라. * 키는 암호학적으로 랜덤하게 생성되며, 메모리 내 바이트 배열로써 저장되어야 한다. 만약 패스워드가 사용 중이라면, 이는 적절한 패스워드 기반 키 유도 함수를 통한 키로 변환된 상태여야 한다. * 적절한 곳에서 암호학적 무작위성이 사용되는지와 낮은 엔트로피나 예측 가능한 시드가 사용되지 않는지 확인해라. 대다수의 현대 API는 개발자에게 CSPRNG에 보안을 설정할 것을 요구하지 않는다. -* MD5, SHA1, 암호 블록 체이닝 모드(CBC), PKCS number 1 v1.5. 같은 사용되지 않는 암호학 함수, 블록 빌딩 메소드, 패딩 스키마 사용을 피해라. +* MD5, SHA1, CBC 운영 모드, PKCS number 1 v1.5. 같은 사용되지 않는 암호학 함수, 블록 빌딩 메소드와 패딩 스키마 사용을 피해라. * 리뷰, 보안 전문가, 사용할 도구의 목적사항을 통해 설정 값이 보안 요구사항에 맞는지 확인해라. * 양자 컴퓨터 이후의 암호학(PQC)을 준비해야 하며, 고위험 시스템은 2030년 전까지 반드시 안전하게 보호되도록 하여야 한다.(ENISA 참고) ## 공격 시나리오 예시. -**시나리오 1**: A 사이트는 모든 페이지에 TLS 강제을사용하지 않거나 약한 암호화 알고리즘을 지원한다. 공격자는 네트워크 트래픽을 모니터링해 가로챈 요청에서 HTTPS에서 HTTP로 다운그레이드하여 사용자의 세션 쿠키를 가로챌 수 있다. 공격자는 세션 쿠키를 재전송해 사용자 세션을 하이재킹하여 사용자 개인 정보 접근 또는 변조가 가능하다. 위 내용 말고도 공격자는 전송되는 모든 데이터 변조가 가능하다. (예: 송금 수신자) +**시나리오 1**: A 사이트는 모든 페이지에 TLS 강제를 사용하지 않거나 약한 암호화 알고리즘을 지원한다. 공격자는 네트워크 트래픽을 모니터링하여(예: 안전하지 않은 무선 환경) 가로챈 요청에서 HTTPS에서 HTTP로 다운그레이드 한 뒤 사용자의 세션 쿠키를 가로챌 수 있다. 공격자는 세션 쿠키를 재전송해 사용자 세션을 하이재킹하여 사용자 개인 정보 접근 또는 변조가 가능하다. 위 내용 말고도 공격자는 전송되는 모든 데이터 변조가 가능하다. (예: 송금 수신자) -**시나리오 2**: 데이터베이스 내 패스워드는 솔트가 포함되지 않는 단순 해시로 모든 사용자의 패스워드를 저장한다. 파알 업로드 취약점으로 사용자 패스워드 해시값 탈취가 가능하고, 솔트가 포함되지 않는 해시는 사전 계산된 레인보우 테이블로 매핑하여 원본 패스워드 탈취가 가능하다. 간단하고 빠른 해시 함수로 생성한 해시는 GPU로 크랙 가능하며, 이는 솔트가 포함된 패스워드 또한 마찬가지다. -\* 솔트가 포함된 패스워드라 하더라도 공격자가 보유 중인 패스워드 사전 목록 또는 브루트 포싱을 이용해 레인보우 테이블을 생성해 패스워드 매핑 작업이 가능하다. 이를 방지하기 위해 대소문자, 특수문자, 숫자가 포함되고 사용자 인적사항과 관련없는 13자리 이상의 패스워드 사용을 권장하는 것이다. +**시나리오 2**: 데이터베이스 내 패스워드는 솔트가 포함되지 않는 단순 해시로 모든 사용자의 패스워드를 저장한다. 파알 업로드 취약점으로 사용자 패스워드 해시값 탈취가 가능하고, 솔트가 포함되지 않는 해시는 사전 계산된 레인보우 테이블로 매핑하여 원본 패스워드 탈취가 가능하다. 솔트가 포함된 패스워드라도 단순하고 빠른 해시 함수로 생성한 해시는 GPU로 크랙 가능하다. ## 참조. From 4f26c2d37d4abef7ac1d940375a8e4a097baa649 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Mon, 5 Jan 2026 23:53:26 +0900 Subject: [PATCH 095/167] fix typo --- 2025/docs/ko/A04_2025-Cryptographic_Failures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 4f8f89ab0..a888a3864 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -112,7 +112,7 @@ **시나리오 1**: A 사이트는 모든 페이지에 TLS 강제를 사용하지 않거나 약한 암호화 알고리즘을 지원한다. 공격자는 네트워크 트래픽을 모니터링하여(예: 안전하지 않은 무선 환경) 가로챈 요청에서 HTTPS에서 HTTP로 다운그레이드 한 뒤 사용자의 세션 쿠키를 가로챌 수 있다. 공격자는 세션 쿠키를 재전송해 사용자 세션을 하이재킹하여 사용자 개인 정보 접근 또는 변조가 가능하다. 위 내용 말고도 공격자는 전송되는 모든 데이터 변조가 가능하다. (예: 송금 수신자) -**시나리오 2**: 데이터베이스 내 패스워드는 솔트가 포함되지 않는 단순 해시로 모든 사용자의 패스워드를 저장한다. 파알 업로드 취약점으로 사용자 패스워드 해시값 탈취가 가능하고, 솔트가 포함되지 않는 해시는 사전 계산된 레인보우 테이블로 매핑하여 원본 패스워드 탈취가 가능하다. 솔트가 포함된 패스워드라도 단순하고 빠른 해시 함수로 생성한 해시는 GPU로 크랙 가능하다. +**시나리오 2**: 데이터베이스 내 패스워드는 솔트가 포함되지 않는 단순 해시로 모든 사용자의 패스워드를 저장한다. 파일 업로드 취약점으로 사용자 패스워드 해시값 탈취가 가능하고, 솔트가 포함되지 않는 해시는 사전 계산된 레인보우 테이블로 매핑하여 원본 패스워드 탈취가 가능하다. 솔트가 포함된 패스워드라도 단순하고 빠른 해시 함수로 생성한 해시는 GPU로 크랙 가능하다. ## 참조. From de3114335e47621d4b8df591412268e9da5cd9c3 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 00:10:56 +0900 Subject: [PATCH 096/167] Apply review feedback --- ...-Security_Logging_and_Alerting_Failures.md | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index d827936fc..bbf75d05c 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -3,7 +3,7 @@ ## 배경. -보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식에 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *로그 기록 시 출력 인코딩 처리 미흡(CWE-117), 로그에 민감정보가 기록(CWE-532), 그리고 불충분한 로깅(CWE-778)이다.* +보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *로그 기록 시 출력 인코딩 처리 미흡(CWE-117), 로그에 민감 정보 기록(CWE-532), 그리고 불충분한 로깅(CWE-778)이다.* ## 점수표. @@ -56,9 +56,9 @@ ## 설명. -로깅과 모니터링이 없으면 공격 및 침해를 탐지할 수 없으며, 알림이 없으면 보안 인시던트 발생시 신속하고 효과적으로 대응하기가 매우 어렵다. 다음과 같은 경우에는 불충분한 로깅, 지속적인 모니터링, 탐지 및 능동적 대응을 시작하기 위한 알림의 미흡이 발생한다. 아래와 같은 경우, 능동적 대응을 개시하기 위한 로깅, 지속적 모니터링, 탐지, 알림이 부족한 것으로 볼 수 있다. +로깅과 모니터링이 없으면 공격 및 침해를 탐지할 수 없으며, 알림이 없으면 보안 인시던트 발생 시 신속하고 효과적으로 대응하기가 매우 어렵다. 아래와 같은 경우, 능동적 대응을 위한 로깅, 지속적 모니터링, 탐지, 알림이 부족한 것으로 볼 수 있다. -* 로그인, 로그인 실패, 중요 거래 데이터 등 감사가 필요한 대상의 이벤트가 누락되거나 기준 없이 들쭉날쭉하게(예: 성공 로그인만 기록) 로깅되는 경우. +* 로그인, 로그인 실패, 중요 거래 데이터 등 감사가 필요한 대상의 이벤트가 누락되거나 기준 없이 일관성 없이(예: 성공 로그인만 기록) 로깅되는 경우. * 경고 및 오류가 로그 메시지를 생성하지 않거나, 부적절하거나, 불명확한 로그를 생성하는 경우. * 로그가 위변조되지 않도록 무결성 보호가 적용되지 않는 경우. * 애플리케이션 및 API 로그를 기반으로 한 이상징후 모니터링이 수행되지 않는 경우. @@ -66,10 +66,9 @@ * 적절한 알림 임계값 및 대응 에스컬레이션 절차가 마련되어 있지 않거나 효과적이지 않다. 알림이 적시에 확인되지 않거나 검토되지 않는 경우. * 동적 애플리케이션 보안 테스트(DAST) 도구(예: Burp 또는 ZAP)에 의한 침투 테스트 및 스캔이 알림을 트리거하지 않는 경우. * 진행 중인 공격을 실시간 혹은 준실시간으로 탐지하지 못하거나 상위 단계로 에스컬레이션하거나 알림을 발생시키지 못하는 경우. -* 로깅 및 알림 이벤트를 사용자 또는 공격자에게 노출 하거나([A01:2025-접근 제어 실패](A01_2025-Broken_Access_Control.md) 참조), 로깅되면 안 되는 민감정보(예: PII 또는 PHI)를 로깅함으로써 민감정보 유출에 취약한 경우. +* 로깅 및 알림 이벤트를 사용자 또는 공격자에게 노출하거나([A01:2025-접근 제어 실패](A01_2025-Broken_Access_Control.md) 참조), 로깅되면 안 되는 민감정보(예: PII 또는 PHI)를 로깅함으로써 민감정보 유출에 취약한 경우. * 로그 데이터 인코딩이 부적절해 로깅 또는 모니터링 시스템 자체가 인젝션 등 공격 대상이 되는 경우. * 애플리케이션이 오류 및 예외 처리를 누락 또는 오처리하여 시스템이 오류 발생 자체를 인지하지 못하고, 결과적으로 문제를 로그로 남길 수 없는 경우. -* 특수 상황을 식별하기 위한 알림 '유스케이스'가 없거나 오래되어 현재 환경을 반영하지 못한다. * 특정 상황을 탐지해 알림을 발생시키기 위한 인시던트 유스케이스(use case)가 없거나, 갱신이 되지 않아 현행 환경을 충분히 반영하지 못하는 경우. * 너무 많은 오탐 알림으로 인해 중요한 알림과 중요하지 않은 알림을 구분할 수 없게 되어, 알림이 너무 늦게 인지되거나 전혀 인지되지 않는 경우(SOC 팀의 물리적 과부하). * 유스케이스에 대한 플레이북이 불완전하거나, 최신이 아니거나, 누락되어 감지된 알림을 올바르게 처리할 수 없는 경우. @@ -80,15 +79,14 @@ 개발자는 애플리케이션의 위험도에 따라 아래 통제 항목 중 일부 또는 전체를 구현해야 한다. * 모든 로그인, 접근 통제 및 서버 측 입력 검증 실패에 대해 로그를 남기며, 의심스럽거나 악성인 계정을 식별할 수 있을 만큼 충분한 유저 컨텍스트를 포함하고, 사후 포렌식 분석을 위해 충분한 기간 동안 저장한다. -* 보안 통제가 포함된 애플리케이션의 모든 부분에서, 성공 여부와 관계없이 로깅되도록 보장한다. * 보안 통제가 적용된 구간은 성공 및 실패 여부와 무관하게 모두 로깅 대상에 포함한다. * 로그는 중앙 로그 플랫폼이 쉽게 수집할 수 있는 표준화된 포맷으로 생성한다. * 로그 데이터는 인코딩을 확실히 적용해 로깅 및 모니터링 시스템의 로그 기반 인젝션 및 공격을 예방한다. * 모든 트랜잭션에 대해 감사 로그를 남기고, 추가만 가능한(append-only) 데이터베이스 테이블 등으로 삭제 및 변조를 어렵게 하는 무결성 통제를 적용한다. -* 오류가 발생한 모든 트랜잭션은 롤백되고 다시 시작되도록 한다. 또한, 기본적으로 차단(fail closed)되도록 한다. -* 애플리케이션 또는 사용자 행위가 의심스러운 경우 알림을 발행한다. 개발자가 해당 내용을 대응하여 코드를 개발할 수 있도록 가이드를 제공하거나, 이를 위한 시스템을 구매한다. +* 오류가 발생한 모든 트랜잭션은 롤백되고 다시 시작되도록 한다. 또한, 페일 클로즈드(fail closed)되도록 한다. +* 애플리케이션 또는 사용자 행위가 의심스러운 경우 알림을 발행한다. 개발자가 이를 코드로 구현할 수 있도록 가이드를 제공하거나, 이를 위한 시스템을 구매한다. * DevSecOps 및 보안 팀은 SOC(Security Operations Center) 팀이 의심 활동을 신속히 탐지하고 대응할 수 있도록, 플레이북을 포함한 효과적인 모니터링 및 알림 유스케이스를 수립해야 한다. -* 공격자를 위한 함정으로 '허니토큰(honeytoken)'을 애플리케이션에 추가한다. 예를 들어 데이터베이스 내에 실제 사용자 및/또는 시스템 계정 형태의 데이터 또는 식별자를 삽입한다. 허니토큰은 정상 업무에서는 사용되지 않으므로, 접근이 발생하면 관련 이벤트가 로그로 남고 오탐이 거의 없는 알림 조건으로 활용할 수 있다. +* 공격자를 위한 함정으로 '허니 토큰(honeytoken)'을 애플리케이션에 추가한다. 예를 들어 데이터베이스 내에 실제 사용자 및/또는 시스템 계정 형태의 데이터 또는 식별자를 삽입한다. 허니토큰은 정상 업무에서는 사용되지 않으므로, 접근이 발생하면 관련 이벤트가 로그로 남고 오탐이 거의 없는 알림 조건으로 활용할 수 있다. * 필요 시 행위 기반 분석 및 AI를 보조 수단으로 활용해 오탐을 낮추고 알림 품질을 개선한다. * NIST 800-61r2 이상 수준의 인시던트 대응 및 복구 계획을 마련하고, 개발자에게 공격/인시던트 징후를 교육해 보고 및 초기 대응이 가능하도록 한다. @@ -98,11 +96,11 @@ ## 공격 시나리오 예시. -**시나리오 1:** 한 아동 건강보험 제공업체의 웹사이트 운영자는 모니터링 및 로깅 부재로 인해 침해 사고를 탐지하지 못했다. 외부 제3자가 해당 제공업체에 공격자가 350만 명이 넘는 아동의 민감한 건강 기록 수천 건에 접근하여 이를 수정했다고 통보했다. 사후 분석에서는 핵심 취약점이 장기간 방치된 정황이 확인되었으며, 로그와 모니터링이 없어 침해가 2013년부터 7년 이상 지속되었을 가능성도 배제할 수 없었다. +**시나리오 1:** 한 아동 건강보험 제공업체의 웹사이트 운영자는 모니터링 및 로깅 부재로 인해 침해 사고를 탐지하지 못했다. 외부 제3자가 해당 제공업체에 공격자가 350만 명이 넘는 아동의 민감한 건강 기록 수천 건에 접근하여 이를 수정했다고 통보했다. 사후 분석에서는 웹사이트 개발자가 중대한 취약점을 장기간 방치된 정황이 확인되었으며, 시스템의 로그와 모니터링되고 있지 않아 침해가 2013년부터 7년 이상 지속되었을 가능성도 존재한다. -**시나리오 2:** 인도의 주요 항공사에서 여권 및 신용카드 데이터를 포함해 수백만 명 승객의 10년 이상 분량 개인정보가 관련된 데이터 유출이 발생했다. 해당 유출은 제3자 클라우드 호스팅 제공업체에서 발생했으며, 해당 제공업체는 일정 시간이 지난 뒤 항공사에 침해 사실을 통보했다. +**시나리오 2:** 인도의 주요 항공사에서 여권 및 신용카드 데이터를 포함해 수백만 명 승객의 10년 이상 분량 개인정보가 유출되었다. 해당 유출은 제3자 클라우드 호스팅 제공업체에서 발생했으며, 해당 제공업체는 일정 시간이 지난 뒤에야 항공사에 침해 사실을 통보했다. -**사나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취했다. 그 결과 항공사는 개인정보 감독기관으로부터 2,000만 파운드의 벌금을 부과받았다. +**사나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취되었다. 그 결과 항공사는 개인정보 감독기관으로부터 2,000만 파운드의 벌금을 부과받았다. ## 참조. From cbbc6e99ee111221caa4277e0e408cbf0d21b49f Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:02:56 +0900 Subject: [PATCH 097/167] Apply review feedback --- 2025/docs/ko/X01_2025-Next_Steps.md | 60 ++++++++++++++--------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index a5ff337b1..84964709c 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -2,14 +2,14 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선정한다. 각 버전의 OWASP Top 10에는 포함 여부를 두고 충분히 검토되었으나, 다른 위험들이 더 빈번하게 발생하고 영향도도 더 컸기 때문에 최종 목록에 포함되지 않은 "경계선상(on the cusp)" 위험들이 존재한다. -아래의 세 가지 이슈는 발견 및 조치에 투자할 만한 가치가 크며, 성숙한 애플리케이션 보안 프로그램을 목표로 하는 조직, 보안 자문 회사, 또는 제품의 커버리지를 확장하려는 보안 도구 벤더에 특히 유용하게 사용될 수 있다. +아래의 세 가지 이슈는 발견 및 조치에 투자할 만한 가치가 크며, 성숙한 애플리케이션 보안 프로그램을 목표로 하는 조직, 보안 컨설팅 회사, 또는 제품의 커버리지를 확장하려는 보안 도구 벤더에 특히 유용할 수 있다. ## X01:2025 애플리케이션 복원력 부족 ### 배경. -이 카테고리는 2021년의 서비스 거부(Denial of Service)를 재명명한 것이다. 기존 명칭은 근본 원인보다는 발생 현상을 설명하는 성격이 강해, 이를 보완하기 위해 재명명되었다. 이 카테고리는 복원력과 관련된 약점을 설명하는 CWE에 초점을 둔다. 점수 산정은 A10:2025-부적절한 예외 처리와 매우 근접했다. 관련된 CWE로는 *CWE-400 통제되지 않은 자원 소비, CWE-409 고압축 데이터의 부적절한 처리(데이터 증폭), CWE-674 통제되지 않은 재귀*, 그리고 *CWE-835 종료 조건에 도달할 수 없는 루프(무한루프).*가 있다. +이 카테고리의 명칭은 2021년 버전의 서비스 거부(Denial of Service)에서 현재 명칭으로 변경됐다. 기존 명칭은 근본 원인보다는 발생 현상을 설명하는 성격이 강해, 이를 보완하기 위해 재명명되었다. 이 카테고리는 복원력과 관련된 약점을 설명하는 CWE에 초점을 둔다. 점수 산정은 A10:2025-부적절한 예외 처리와 매우 근접했다. 관련된 CWE로는 *CWE-400 통제되지 않은 자원 소비, CWE-409 고압축 데이터의 부적절한 처리(데이터 증폭), CWE-674 통제되지 않은 재귀*, 그리고 *CWE-835 종료 조건에 도달할 수 없는 루프(무한 루프).*가 있다. ### 점수표. @@ -62,7 +62,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 ### 설명. -이 카테고리는 애플리케이션이 스트레스, 장애 및 예외 케이스에 대응하는 방식 전반에 존재하는 시스템적 약점을 의미하며, 그 결과 장애 상황에서 애플리케이션이 정상 상태로 복구하지 못할 수 있다. 애플리케이션이 예기치 않은 조건, 리소스 제약 및 기타 불리한 이벤트를 원활하게(gracefully) 처리하지 못하거나, 견디지 못하거나, 또는 복구하지 못할 경우, 가용성 문제(일반적으로)로 이어지며, 그 외에도 데이터 손상, 민감 데이터 노출, 연쇄 장애, 및/또는 보안 통제 우회를 유발할 수 있다. +이 카테고리는 애플리케이션이 스트레스, 장애 및 엣지 케이스에 대응하는 방식 전반에 존재하는 시스템적 약점을 의미하며, 그 결과 장애 발생 시 애플리케이션이 정상 상태로 복구하지 못할 수 있다. 애플리케이션이 예기치 않은 조건, 리소스 제약 및 기타 불리한 이벤트를 원활하게(gracefully) 처리하지 못하거나, 견디지 못하거나, 또는 복구하지 못할 경우, 가용성 문제(일반적으로)로 이어지며, 그 외에도 데이터 손상, 민감 데이터 노출, 연쇄 장애 또는 보안 통제 우회를 유발할 수 있다. 또한 [X02:2025 메모리 관리 실패](#x022025-memory-management-failures) 역시 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있다. @@ -70,20 +70,20 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 이 유형의 취약점을 예방하기 위해서는 시스템의 장애와 복구를 기본 전제로 설계해야 한다. -* 제한, 할당량 및 장애 극복 기능(failover) 기능을 추가하되, 특히 자원을 가장 많이 소모하는 작업에 주의를 기울인다. +* 제한, 할당량 및 장애 극복(failover) 기능을 추가하되, 특히 자원을 가장 많이 소모하는 작업에 주의를 기울인다. * 자원 소모가 큰 페이지를 식별하고 사전에 대비해야 한다: 공격 표면을 줄이되, 특히 불명의 또는 신뢰할 수 없는 사용자에게 불필요한 '가젯(gadgets)'과 많은 자원(예: CPU, 메모리)을 요구하는 기능을 노출하지 않도록 한다. -* 입력값은 크기 제한을 적용하고 허용 리스트 기반으로 엄격히 검증한뒤, 철저히 테스트한다. +* 입력값은 크기 제한을 적용하고 허용 리스트 기반으로 엄격히 검증한 뒤, 철저히 테스트한다. * 응답 크기를 제한하고, 가공되지 않은(raw) 응답을 클라이언트에 그대로 반환하지 않는다(서버 측에서 우선 처리한다). -* 기본값으로 안전/차단(절대로 오픈을 사용하지 않는다)로 설정하고, 우선적으로 차단(deny by default)하며, 오류가 발생하면 롤백한다. +* 기본적으로 페일 클로즈드(fail closed)를 사용하고 절대로 페일 오픈(fail open)을 사용하지 않는다. 우선 거부 정책(deny by default)을 사용하며, 오류가 발생하면 롤백한다. * 리퀘스트 스레드에서 동기식 차단 호출(blocking synchronous call)을 피한다(비동기/논블로킹 사용, 타임아웃 설정, 동시성 제한 등). * 에러 처리 기능을 신중하게 테스트한다. -* 서킷 브레이커, 격벽(bulkhead), 다시 시도(retry logic), 우아한 성능 저하(graceful degradation)와 같은 복원력 패턴을 구현한다. +* 서킷 브레이커, 격벽(bulkhead), 재시도 로직(retry logic), 우아한 성능 저하(graceful degradation)와 같은 복원력 패턴을 구현한다. * 성능 및 부하 테스트를 수행한다. 조직의 위험 수용 범위 내에서 카오스 엔지니어링을 도입한다. -* 합리적이고 비용적으로 감당 가능한 범위에서 이중화(redundancy)을 구현하고, 이를 전제로 아키텍처를 설계한다. +* 합리적이고 비용적으로 감당 가능한 범위에서 이중화(redundancy)를 구현하고, 이를 전제로 아키텍처를 설계한다. * 모니터링, 옵저버빌리티, 알림을 구현한다. * RFC 2267을 준수해 잘못된 발신자 주소를 필터링한다. * 핑거프린트, IP 또는 행위 기반 동적 탐지로 알려진 봇넷을 차단한다. -* 작업 증명(Proof-of-Work) 적용. 자격 증명을 적용하여 자원 소모 작업을 서버가 아니라 *공격자* 측에 부과한다. 정상 사용자 경험에 미치는 영향은 최소화하고, 시스템 부하가 상승할수록 자격증명 난이도를 높이고, 특히 신뢰도가 낮거나 봇으로 판단되는 트래픽에는 더 높은 난이도를 적용한다. +* 작업 증명(Proof-of-Work)을 적용하여 자원 소모 작업을 서버가 아니라 *공격자* 측에 부과한다. 정상 사용자 경험에 미치는 영향은 최소화하고, 시스템 부하가 상승할수록 자격증명 난이도를 높이고, 특히 신뢰도가 낮거나 봇으로 판단되는 트래픽에는 더 높은 난이도를 적용한다. * 비활성 시간과 최종 타임아웃을 기준으로 서버 측 세션 시간을 제한한다. * 세션에 저장되는 상태 정보는 최소화한다. @@ -92,9 +92,9 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 **시나리오 1:** 공격자가 리소스 소모를 유도해 시스템 장애를 유발하고, 결과적으로 서비스 거부(DoS) 상태를 만든다. 예로 메모리 고갈, 디스크 용량 소진, CPU 사용량 포화, 커넥션 무제한 연결 등이 있다. -**시나리오 2:** 입력값 퍼징을 통해 비정상 입력을 대량 주입하고, 그 결과 비즈니스 로직을 오동작시키는 형태의 응답이 유도되도록 만든다. +**시나리오 2:** 입력값 퍼징을 통해 비정상 입력을 대량 주입하고, 비즈니스 로직을 오동작시키는 조작된 응답을 유도한다. -**시나리오 3:** 공격자가 애플리케이션의 의존성을 공격하여 API 또는 기타 외부 서비스를 다운시키며, 애플리케이션이 동작할 수 없게 한다. +**시나리오 3:** 공격자가 애플리케이션의 의존성을 공격하여 API 또는 기타 외부 서비스를 다운시키며, 애플리케이션이 정상 동작할 수 없게 만든다. ### 참조. @@ -153,7 +153,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 ### 배경. -Java, C#, JavaScript/TypeScript(node.js), Go, 그리고 "안전" Rust와 같은 언어는 메모리 안전이다. 메모리 관리 문제는 C 및 C++와 같은 비메모리 안전 언어에서 발생하는 경향이 있다. 이 카테고리는 관련 CVE가 세 번째로 많음에도 불구하고, 커뮤니티 설문에서는 가장 낮은 점수를 받았고 데이터 상에서도 낮게 나타났다. 이는 전통적인 데스크톱 애플리케이션보다 웹 애플리케이션이 우세하기 때문이라고 본다. 메모리 관리 취약점은 주로 가장 높은 CVSS 점수를 가진다. +Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같은 언어는 메모리 안전한 언어이다. 메모리 관리 문제는 C 및 C++와 같은 메모리가 안전하지 않은 언어에서 발생하는 경향이 있다. 이 카테고리는 관련 CVE가 세 번째로 많음에도 불구하고, 커뮤니티 설문에서는 가장 낮은 점수를 받았고 데이터상에서도 낮게 나타났다. 이는 전통적인 데스크톱 애플리케이션보다 웹 애플리케이션이 우세하기 때문이라고 본다. 메모리 관리 취약점은 대체로 가장 높은 CVSS 점수를 가진다. ### 점수표. @@ -206,7 +206,7 @@ Java, C#, JavaScript/TypeScript(node.js), Go, 그리고 "안전" Rust와 같은 ### 설명. -애플리케이션이 메모리를 직접 관리해야 할 때, 실수를 하기 매우 쉽다. 메모리 안전 언어가 더 많이 사용되고 있지만, 전 세계 운영 환경에는 여전히 많은 레거시 시스템이 존재하며, 비메모리 안전 언어의 사용이 필요한 새로운 저수준 시스템과 메인프레임, IoT 장치, 펌웨어 및 자체 메모리를 관리해야 할 수 있는 기타 시스템과 상호작용하는 웹 애플리케이션도 여전히 많다. 대표적인 CWE로는 *CWE-120 입력 크기 확인 없이 버퍼 복사(‘클래식 버퍼 오버플로’)* 및 *CWE-121 스택 기반 버퍼 오버플로*가 있다. +애플리케이션이 메모리를 직접 관리해야 할 때 실수가 발생하기 쉽다. 메모리 안전 언어가 더 많이 사용되고 있지만, 전 세계 운영 환경에는 여전히 많은 레거시 시스템이 존재하며, 메모리가 안전하지 않은 언어가 필요한 새로운 저수준 시스템과 메인프레임, IoT 장치, 펌웨어 및 자체 메모리를 관리해야 할 수 있는 기타 시스템과 상호작용하는 웹 애플리케이션도 여전히 많다. 대표적인 CWE로는 *CWE-120 입력 크기 확인 없이 버퍼 복사('클래식 버퍼 오버플로')* 및 *CWE-121 스택 기반 버퍼 오버플로*가 있다. 메모리 관리 실패는 다음과 같은 경우에 발생할 수 있다. @@ -219,7 +219,7 @@ Java, C#, JavaScript/TypeScript(node.js), Go, 그리고 "안전" Rust와 같은 * 초기화되지 않은 변수를 사용하는 경우. * 메모리 누수 또는 비정상 메모리 소모로 가용 메모리가 고갈되어 장애로 이어지는 경우. -메모리 관리 실패는 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있으며, 이는 [X01:2025 Lack of Application Resilience](#x012025-lack-of-application-resilience)를 함께 참고한다. +메모리 관리 실패는 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있으며, 이는 [X01:2025 애플리케이션 복원력 부족](#x012025-lack-of-application-resilience)를 함께 참고한다. ### 대응 방안. @@ -232,27 +232,27 @@ Java, C#, JavaScript/TypeScript(node.js), Go, 그리고 "안전" Rust와 같은 * 애플리케이션의 메모리 누수를 모니터링한다. * 시스템으로 들어오는 모든 입력을 매우 신중하게 검증하고, 기대 조건을 충족하지 않는 입력은 모두 거부한다. * 사용 중인 언어를 학습하여 위험한 함수와 비교적 안전한 함수의 목록을 작성하고, 이를 팀과 공유한다. 가능하다면 이를 시큐어 코딩 가이드라인이나 표준에 추가한다. 예를 들어, C 언어에서는 strcpy() 대신 strncpy()를, strcat() 대신 strncat()을 우선적으로 사용한다. -* 언어나 프레임워크에서 메모리 안전 라이브러리를 제공한다멵 이를 사용한다. 예: Safestringlib 또는 SafeStr. +* 언어나 프레임워크에서 메모리 안전 라이브러리를 제공한다면 이를 사용한다. 예: Safestringlib 또는 SafeStr. * 가능하면 원시 배열과 포인터보다 관리형 버퍼 및 문자열을 사용한다. -* 메모리 이슈 및/또는 사용 언어에 특화된 시큐어 코딩 교육을 수행(수강?)한다. 교육 담당자에게 메모리 관리 실패에 대해 우려하고 있음을 알린다. -* 코드 리뷰 및/또는 정적 분석을 수행한다. +* 메모리 이슈나 사용 중인 언어에 초점을 맞춘 시큐어 코딩 교육을 받는다. 교육 담당자에게 메모리 관리 실패에 대해 우려하고 있음을 알린다. +* 코드 리뷰 및 정적 분석을 수행한다. * StackShield, StackGuard, Libsafe 등 메모리 관리를 돕는 컴파일러/도구를 사용한다. * 시스템의 모든 입력에 대해 퍼징을 수행한다. * 모의침투 테스트를 수행하는 경우, 테스터에게 메모리 관리 실패에 대한 우려가 있으며 테스트 중 해당 부분에 특별히 주의를 기울여 줄 것을 요청한다. -* 컴파일러 오류뿐 아니라 경고까지 모두 수정한다. 프로그램이 컴파일된다고 해서 경고를 무시하지 않는다. +* 컴파일러 오류와 경고를 *모두* 수정한다. 프로그램이 컴파일된다고 해서 경고를 무시하지 않는다. * 기반 인프라가 정기적으로 패치, 스캔, 하드닝되도록 보장한다. -* 특히 기반 인프라를 대상으로한 잠재적 메모리 취약점 및 기타 장애 요인을 모니터링한다. +* 특히 기반 인프라를 대상으로 한 잠재적 메모리 취약점 및 기타 장애 요인을 모니터링한다. * 오버플로 공격으로부터 주소 스택을 보호하기 위해 [카나리(canaries)](https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries) 사용을 고려한다. ### 공격 시나리오 예시. -**시나리오 #1:** 버퍼 오버플로는 가장 유명한 메모리 취약점으로, 공격자가 필드가 수용할 수 있는 것보다 더 많은 데이터를 입력하여 해당 변수에 대해 생성된 버퍼를 넘치게 만드는 상황을 말한다. 공격이 성공하면 넘친 데이터가 스택 포인터를 덮어쓰게 되며, 이를 통해 공격자가 프로그램에 악의적인 명령을 삽입할 수 있게 된다. +**시나리오 1:** 버퍼 오버플로는 가장 유명한 메모리 취약점으로, 공격자가 필드가 수용할 수 있는 것보다 더 많은 데이터를 입력하여 해당 변수에 대해 생성된 버퍼를 넘치게 만드는 상황을 말한다. 공격이 성공하면 넘친 데이터가 스택 포인터를 덮어쓰게 되며, 이를 통해 공격자가 프로그램에 악의적인 명령을 삽입할 수 있게 된다. -**시나리오 #2:** 해제 후 사용(Use-After-Free, UAF)은 비교적 자주 발생하여 브라우저 버그 바운티에서도 준상시적으로 제보되는 유형의 버그다. 예를 들어 웹 브라우저가 DOM 요소를 조작하는 JavaScript를 처리한다고 하자. 공격자는 객체(예: DOM 요소)를 생성하고 그에 대한 참조를 획득하는 JavaScript 페이로드를 만든다. 이후 정교한 조작을 통해, 브라우저가 해당 객체의 메모리를 해제하도록 유도하면서도 그 객체를 가리키는 댕글링 포인터는 유지하게 만든다. 메모리가 해제되었음을 브라우저가 인지하기 전에, 공격자는 *동일한* 메모리 공간을 차지하도록 새 객체를 할당한다. 브라우저가 원래 포인터를 사용하려고 하면, 그 포인터는 이제 공격자가 통제하는 데이터를 가리키게 된다. 만약 이 포인터가 가상 함수 테이블을 가리키는 것이었다면, 공격자는 코드 실행 흐름을 자신의 페이로드로 리다이렉션할 수 있다. +**시나리오 2:** 유즈 에프터 프리(Use-After-Free)은 비교적 자주 발생하여 브라우저 버그 바운티에서 흔히 제보되는 제보되는 유형의 버그다. 예를 들어 웹 브라우저가 DOM 요소를 조작하는 JavaScript를 처리하는 상황을 가정하자. 공격자는 객체(예: DOM 요소)를 생성하고 그에 대한 참조를 획득하는 JavaScript 페이로드를 작성한다. 이후 정교한 조작을 통해, 브라우저가 해당 객체의 메모리를 해제하도록 유도하면서도 그 객체를 가리키는 댕글링 포인터(dangling pointer)는 유지하게 만든다. 브라우저가 메모리 해제를 인지하기 전에, 공격자는 *동일한* 메모리 공간을 차지하도록 새 객체를 할당한다. 브라우저가 원래 포인터를 사용하면, 이제 그 포인터는 공격자가 삽입한 데이터를 참조하게 된다. 만약 이 포인터가 가상 함수 테이블을 가리키는 것이었다면, 공격자는 코드 실행 흐름을 자신의 페이로드로 리다이렉션할 수 있다. -**시나리오 #3:** 사용자 입력을 받아 적절히 검증하거나 정제하지 않고 로깅 함수로 직접 전달하는 네트워크 서비스를 가정해 보자. 사용자 입력은 형식을 지정하는 syslog("%s", user_input) 대신 형식을 지정하지 않은 syslog(user_input) 형태로 로깅 함수에 전달된다. 공격자는 스택 메모리를 읽기 위한(민감한 데이터 노출) %x 또는 메모리 주소에 값을 쓰기 위한 %n과 같은 형식 지정자(format specifier)를 포함한 악성 페이로드를 전송한다. 공격자는 여러 형식 지정자를 결합하여 스택 구조를 파악하고, 중요한 주소를 찾아낸 뒤 이를 덮어쓸 수 있다. 이는 포맷 스트링 취약점(형식 문자열 취약점?)에 해당한다. +**시나리오 3:** 사용자 입력을 받아 적절히 검증하거나 정제하지 않고 로깅 함수로 직접 전달하는 네트워크 서비스를 가정해 보자. 사용자 입력은 형식을 지정하는 syslog("%s", user_input) 대신 형식을 지정하지 않은 syslog(user_input) 형태로 로깅 함수에 전달된다. 공격자는 스택 메모리를 읽기 위한(민감한 데이터 노출) %x 또는 메모리 주소에 값을 쓰기 위한 %n과 같은 형식 지정자(format specifier)를 포함한 악성 페이로드를 전송한다. 공격자는 여러 형식 지정자를 결합하여 스택 구조를 파악하고, 중요한 주소를 찾아낸 뒤 이를 덮어쓸 수 있다. 이는 포맷 스트링 취약점(format string vulnerability)에 해당한다. -참고: 현대의 브라우저는 [browser sandboxing](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing), ASLR, DEP/NX, RELRO 및 PIE를 포함하여 이러한 공격을 방어하기 위한 다중 계층의 방어 체계를 사용한다. 브라우저에 대한 메모리 관리 실패 공격은 수행하기에 단순한 공격이 아니다. +참고: 현대의 브라우저는 [브라우저 샌드박스](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing), ASLR, DEP/NX, RELRO 및 PIE를 를 포함한 심층적 방어 체계를 사용하기에, 브라우저에 대한 메모리 관리 실패 공격이 쉽지 않다. ### 참조. @@ -285,16 +285,16 @@ Java, C#, JavaScript/TypeScript(node.js), Go, 그리고 "안전" Rust와 같은 -## X03:2025 AI 생성 코드에 대한 부적절한 신뢰(‘바이브 코딩’, ‘Vibe Coding’) +## X03:2025 AI 생성 코드에 대한 부적절한 신뢰('바이브 코딩') ### 배경. -현재 전 세계가 AI 사용에 대해 이야기하고 사용하고 있으며, 여기에는 소프트웨어 개발자도 포함된다. 현재로서는 AI 생성 코드와 직접적으로 관련된 CVE나 CWE는 없지만, AI 생성 코드가 인간이 작성한 코드보다 더 많은 취약점을 포함하는 경우가 많다는 사실은 널리 알려져 있으며 문서로도 입증되어 있다. +현재 전 세계가 AI에 대해 이야기하고 활용하고 있으며, 소프트웨어 개발자도 예외는 아니다. 아직 AI 생성 코드와 직접 관련된 CVE나 CWE는 없지만, AI 생성 코드가 인간이 작성한 코드보다 더 많은 취약점을 포함하는 경우가 많다는 사실은 널리 알려져 있고 문서로도 입증되어 있다. ### 설명. -우리는 소프트웨어 개발 관행이 변화하여, AI의 도움을 받아 작성한 코드뿐 아니라 사람의 검토 없이 거의 전적으로 작성되어 그대로 커밋되는 코드(흔히 ‘바이브 코딩(vibe coding)’이라 불림)까지 포함하는 흐름을 보고 있다. 예전에도 블로그나 웹사이트의 코드 스니펫을 깊이 생각하지 않고 복사하는 것이 결코 바람직하지 않았던 것과 마찬가지로, 이 경우에는 문제가 더 악화된다. 안전하고 좋은 코드 스니펫은 예나 지금이나 드물며, 시스템 제약으로 인해 AI가 통계적으로 그러한 좋은 예시를 충분히 반영하지 못할 수도 있다. +우리는 소프트웨어 개발 관행이 변화하여, AI의 도움을 받아 작성한 코드뿐 아니라 사람의 검토 없이 거의 전적으로 작성되어 그대로 커밋되는 코드(흔히 '바이브 코딩'이라 불림)까지 포함하는 흐름을 보고 있다. 예전에도 블로그나 웹사이트의 코드 스니펫을 깊이 생각하지 않고 복사하는 것이 결코 바람직하지 않았던 것과 마찬가지로, 이 경우에는 문제가 더 악화된다. 양질의 보안 코드 스니펫은 예나 지금이나 드물며, 시스템적 제약으로 인해 AI가 이런 좋은 예시를 통계적으로 잘 나타내지 못할 수 있다. ### 대응 방안. @@ -306,11 +306,11 @@ AI를 활용해 코드를 작성하는 모든 사람에게 다음 사항을 고 * 조직의 보안 코딩 가이드라인/표준/정책 등과 같이, 자체적으로 수집, 검토한 안전한 코드 샘플과 문서를 기반으로 하는 RAG(Retrieval Augmented Generation) 서버 사용을 고려한다. 또한 RAG 서버가 정책이나 표준을 강제하도록 한다. * 선택한 AI와 함께 사용할 수 있도록, 개인정보 보호와 보안을 위한 가드레일 구현 도구를 구매하는 방안을 고려해야 한다. * 사설(private) AI의 구매를 고려하며, 이상적으로는 조직의 데이터, 쿼리, 코드 또는 기타 민감한 정보로 AI를 학습시키지 않는다는 계약(개인정보 보호 협약 포함)을 체결한다. -* IDE과 AI 사이에 모델 컨텍스트 프로토콜(Model Context Protocol, MCP) 서버를 구축하고, 선택한 보안 도구의 사용을 강제하도록 설정하는 것을 고려한다. +* IDE와 AI 사이에 모델 컨텍스트 프로토콜(Model Context Protocol, MCP) 서버를 구축하고, 선택한 보안 도구의 사용을 강제하도록 설정하는 것을 고려한다. * 개발자(및 전 직원)에게 조직 내에서 AI를 어떻게 사용해야 하고 사용하지 말아야 하는지 안내하기 위해, 소프트웨어 개발 생명 주기(Software Development Life Cycle, SDLC)의 일부로 정책과 프로세스를 수립한다. -* IT 보안 모범 사례를 반영한, 유용(우수?)하고 효과적인 프롬프트 목록을 작성한다. 이상적으로는 내부 시큐어 코딩 가이드라인도 반영해야 한다. 개발자는 해당 프롬프트를 프로그램 개발의 출발점으로 사용할 수 있다. -* AI는 시스템 개발 생명 주기의 각 단계에 포함될 가능성이 높으므로, 이를 효과적이고 안전하게 사용하는 것이 중요하다. 이를 지혜롭게 사용해야 한다. -* 실제로 복잡한 함수, 비즈니스 핵심(business critical) 프로그램, 또는 장기간 사용되는 프로그램에는 바이브 코딩(vibe coding)을 사용하는 것을 권장하지 **않는다**. +* IT 보안 모범 사례를 반영한, 유용하고 효과적인 프롬프트 목록을 작성한다. 이상적으로는 내부 시큐어 코딩 가이드라인도 반영해야 한다. 개발자는 해당 프롬프트를 프로그램 개발의 출발점으로 사용할 수 있다. +* AI는 시스템 개발 생명 주기의 각 단계에 포함될 가능성이 높으므로, 효과적이고 안전하게 사용해야 한다. AI는 지혜롭게 사용해야 한다. +* 실제로 복잡한 함수, 비즈니스 크리티컬 프로그램, 또는 장기간 사용되는 프로그램에는 바이브 코딩을 사용하는 것을 권장하지 **않는다**. * 섀도우 AI(Shadow AI) 사용에 대한 기술적 점검과 보호 조치를 구현한다. * 개발자에게 조직의 정책뿐만 아니라, 안전한 AI 사용 및 소프트웨어 개발에서의 AI 활용 모범 사례에 대한 교육을 실시한다. From b2c71b32be7b70f1fe6f58b126d1fa4103e313c2 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:08:13 +0900 Subject: [PATCH 098/167] Remove excessive English annotations --- ...025-What_are_Application_Security_Risks.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index 18639c8e7..739a84819 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -49,16 +49,16 @@
평균 테스트 커버리지 가중 평균 악용도 + 평균 가중 악용도 가중 평균 영향도 + 평균 가중 영향도 총 발생 건수
-본 위험 등급(Risk Rating)은 악용 가능성, 취약점에서 보안 통제가 누락되어 있을 평균 가능성, 그리고 기술적 영향을 공통 평가 요소로 산정에 반영하였다. +본 위험 등급은 악용 가능성, 취약점에서 보안 통제가 누락되어 있을 평균 가능성, 그리고 기술적 영향을 공통 평가 요소로 산정에 반영하였다. 조직은 각기 고유하며, 해당 조직을 대상으로 하는 위협 행위자, 그들의 목표, 그리고 침해 발생 시 영향도 또한 고유하다. 공익 단체가 대외 정보 제공을 위해 콘텐츠 관리 시스템(Contents Management System, CMS)을 사용하는 경우와, 의료 시스템에서 동일한 CMS를 민감한 의료 정보에 사용하는 경우를 비교하면, 같은 소프트웨어라 하더라도 위협 행위자와 비즈니스 영향은 크게 달라질 수 있다. 애플리케이션의 노출 수준, 상황별 위협 행위자(비즈니스 및 지역에 따른 표적 공격과 비표적 공격), 그리고 개별 비즈니스 영향을 바탕으로 조직의 위험을 이해하는 것이 중요하다. -## 범주를 선택하고 순위를 매기기 위해 데이터가 사용되는 방식 +## 카테고리를 선택하고 순위를 매기기 위해 데이터가 사용되는 방식 -2017년에는 발생률(incidence rate)을 기준으로 가능성(likelihood)을 산정하여 범주를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성(Exploitability), 탐지 가능성(Detectability, 가능성에 포함), 기술적 영향(Technical Impact)을 기준으로 순위를 매겼다. 2021년에는 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. +2017년에는 발생률을 기준으로 가능성을 산정하여 카테고리를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성, 탐지 가능성, 기술적 영향을 기준으로 순위를 매겼다. 2021년에는 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. -우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 악용(Exploit) 점수와 영향 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. +우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 악용(Exploit) 점수와 영향(Impact) 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. CVSSv2에서는 악용과 (기술적) 영향 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 악용은 60%, 영향은 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 악용 6.0, 영향 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. @@ -68,35 +68,35 @@ Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *악용* 또는 *영향* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. -발생률은 일정 기간 동안 조직이 테스트한 애플리케이션 모집단에서, 각 CWE에 취약한 애플리케이션의 비율로 산정하였다. 다시 말해, 우리는 빈도(frequency), 즉 한 애플리케이션에서 문제가 몇 번 발견되는지는 사용하지 않는다. 관심 대상은 애플리케이션 모집단 중 각 CWE가 발견된 애플리케이션의 비율이다. +발생률은 일정 기간 동안 조직이 테스트한 애플리케이션 모집단에서, 각 CWE에 취약한 애플리케이션의 비율로 산정하였다. 다시 말해, 우리는 빈도, 즉 한 애플리케이션에서 문제가 몇 번 발견되는지는 사용하지 않는다. 관심 대상은 애플리케이션 모집단 중 각 CWE가 발견된 애플리케이션의 비율이다. -커버리지(coverage)는 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율로 산정한다. 커버리지가 높을수록 표본 크기가 모집단을 더 잘 대표하므로, 산정된 발생률이 정확하다는 보증 수준이 더 강해진다. +커버리지는 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율로 산정한다. 커버리지가 높을수록 표본 크기가 모집단을 더 잘 대표하므로, 산정된 발생률이 정확하다는 보증 수준이 더 강해진다. 이번 버전에서 사용한 공식은 2021년과 유사하되, 일부 가중치가 변경되었다. (최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 -산정된 점수는 불충분한 접근 제어(Broken Access Control) 범주에서 621.60으로 가장 높았고, 메모리 관리 오류(Memory Management Errors) 범주에서 271.08로 가장 낮았다. +산정된 점수는 불충분한 접근 제어 카테고리에서 621.60으로 가장 높았고, 메모리 관리 실패 카테고리에서 271.08로 가장 낮았다. -이는 완벽한 체계는 아니지만, 위험 범주의 순위를 매기는 데 유용하다. +이는 완벽한 체계는 아니지만, 위험 카테고리의 순위를 매기는 데 유용하다. 추가로 커지고 있는 과제 중 하나는 "애플리케이션"의 정의이다. 업계가 마이크로서비스와 같이 전통적인 애플리케이션보다 더 작은 구성요소로 이루어진 아키텍처로 전환함에 따라, 산정이 더 어려워지고 있다. 예를 들어 조직이 코드 리포지토리를 테스트하는 경우, 무엇을 애플리케이션으로 간주해야 하는가? CVSSv4의 확산과 마찬가지로, Top 10의 다음 판에서는 끊임없이 변화하는 산업 환경을 반영하기 위해 분석과 점수 산정을 조정해야 할 수 있다. ## 데이터 요소 -Top 10 각 범주에는 다음과 같은 데이터 요소가 제시되며, 의미는 다음과 같다. +Top 10 각 카테고리에는 다음과 같은 데이터 요소가 제시되며, 의미는 다음과 같다. -**매핑된 CWE(CWEs Mapped):** Top 10 팀이 해당 범주에 매핑한 CWE의 개수. +**매핑된 CWE:** Top 10 팀이 해당 카테고리에 매핑한 CWE의 개수. -**발생률(Incidence Rate):** 발생률은 해당 연도에 그 조직이 테스트한 모집단에서, 해당 CWE에 취약한 애플리케이션의 비율이다. +**발생률:** 발생률은 해당 연도에 그 조직이 테스트한 모집단에서, 해당 CWE에 취약한 애플리케이션의 비율이다. -**가중 악용(Weighted Exploit):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 악용 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. +**가중 악용:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 악용 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**가중 영향(Weighted Impact):** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. +**가중 영향:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**(테스트) 커버리지((Testing) Coverage):** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. +**(테스트) 커버리지:** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. -**총 발생 건수(Total Occurrences):** 범주에 매핑된 CWE가 발견된 애플리케이션의 총 개수. +**총 발생 건수:** 카테고리에 매핑된 CWE가 발견된 애플리케이션의 총 개수. -**총 CVE(Total CVEs):** 해당 범주에 매핑된 CWE에 매핑된 NVD DB 내 CVE의 총 개수. +**총 CVE:** 해당 카테고리에 매핑된 CWE에 매핑된 NVD DB 내 CVE의 총 개수. -**공식(Formula):** (최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 +**공식:** (최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 From d7f83bc43c2fe0392fa263bc7a80f2ee565d6cf6 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:16:51 +0900 Subject: [PATCH 099/167] typo --- 2025/docs/ko/0x00_2025-Introduction.md | 2 +- .../ko/0x02_2025-What_are_Application_Security_Risks.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index a3a842362..fd45f9c6b 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -58,7 +58,7 @@ MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하 ## 카테고리 선정을 위한 데이터 사용법 -2021년 버전과 마찬가지로 *악용 가능성(Exploitability)* 및 *기술적 영향도((Technical) Impact)*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. +2021년 버전과 마찬가지로 *악용 가능성(Exploitability)* 및 *(기술적) 영향도((Technical) Impact)*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. CVSSv2에서는 Exploit과 (Technical) Impact 모두 최대 10.0까지 가능하였으나, 공식에 따라 Exploit은 60%, Impact는 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 Exploit 6.0, Impact 4.0으로 제한되었다. 가중치를 고려한 결과, Impact 점수는 CVSSv3에서 평균적으로 약 1.5점 상승하였고, Exploitability는 평균적으로 약 0.5점 하락하였다. diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index 739a84819..f5669674f 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -85,18 +85,18 @@ Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 Top 10 각 카테고리에는 다음과 같은 데이터 요소가 제시되며, 의미는 다음과 같다. -**매핑된 CWE:** Top 10 팀이 해당 카테고리에 매핑한 CWE의 개수. +**해당되는 CWE 개수:** Top 10 팀이 해당 카테고리에 매핑한 CWE의 개수. **발생률:** 발생률은 해당 연도에 그 조직이 테스트한 모집단에서, 해당 CWE에 취약한 애플리케이션의 비율이다. -**가중 악용:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 악용 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. +**가중 악용도:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 악용 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**가중 영향:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. +**가중 영향도:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. **(테스트) 커버리지:** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. **총 발생 건수:** 카테고리에 매핑된 CWE가 발견된 애플리케이션의 총 개수. -**총 CVE:** 해당 카테고리에 매핑된 CWE에 매핑된 NVD DB 내 CVE의 총 개수. +**총 CVE 건수:** 해당 카테고리에 매핑된 CWE에 매핑된 NVD DB 내 CVE의 총 개수. **공식:** (최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 From ae3d122b3c271b2f134f9ffd5691f43ed6134ebf Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:17:29 +0900 Subject: [PATCH 100/167] typo --- 2025/docs/ko/0x00_2025-Introduction.md | 6 +++--- 2025/docs/ko/A05_2025-Injection.md | 2 +- 2025/docs/ko/A07_2025-Authentication_Failures.md | 2 +- 2025/docs/ko/index.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index fd45f9c6b..8abafeaee 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -15,7 +15,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! * [A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md) * [A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md) * [A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md) -* [A04:2025 - 암호 체계 실패](A04_2025-Cryptographic_Failures.md) +* [A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md) * [A05:2025 - 인젝션](A05_2025-Injection.md) * [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) * [A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md) @@ -33,7 +33,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! * **[A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. * **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. * **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. -* **[A04:2025 - 암호 체계 실패](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. +* **[A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. * **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동은 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. * **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**은 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 눈에 띄는 개선이 확인되었다. * **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/A07_-Identificatio_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다 @@ -51,7 +51,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! 이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트 된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE의 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 이번 버전에서도 CWE의 발생 빈도를 분석에서 제외한다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 퍼져있는 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경이 불가피하였다. -CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. 근본 원인의 유형에는 "암호 체계 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근분 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. +CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. 근본 원인의 유형에는 "암호 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근분 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다.모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않는 경우 도구, 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 인젝션, 커멘드 인젝션, 크로스 사이트 스크립팅, 하드코딩된 패스워드, 검증 부재, 버퍼 오버플로우, 민감 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index 91a669f36..8640f4162 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -2,7 +2,7 @@ ## 배경. -인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 체계 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화(크로스 사이트 스크립팅)에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향도가 낮아졌다. +인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화(크로스 사이트 스크립팅)에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향도가 낮아졌다. ## 점수표. diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index d9ae93404..81e55855a 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -68,7 +68,7 @@ * 안전하지 않은 "질문-답변 방식 비밀번호 찾기"과 같은 취약하거나 비효율적인 자격 증명 복구 및 비밀번호 찾기 프로세스를 사용하는 경우. -* 평문, 암호화된, 또는 약한 해시(hash)로 해시된 비밀번호를 사용하는 경우. [A04:2025-암호 체계 실패](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/) 참고. +* 평문, 암호화된, 또는 약한 해시(hash)로 해시된 비밀번호를 사용하는 경우. [A04:2025-암호 실패](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/) 참고. * 다중 인증(MFA)이 누락되어 있거나 효과적이지 않은 경우. diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index 82da40c85..e8d9798e6 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -27,7 +27,7 @@ OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제 1. [A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md) 2. [A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md) 3. [A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md) -4. [A04:2025 - 암호 체계 실패](A04_2025-Cryptographic_Failures.md) +4. [A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md) 5. [A05:2025 - 인젝션](A05_2025-Injection.md) 6. [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) 7. [A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md) From 08cb836ed6825a2f8d76bed8a8ec06473d984eb3 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:20:49 +0900 Subject: [PATCH 101/167] Remove excessive English annotations --- ...g_a_Modern_Application_Security_Program.md | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 05b8a792b..86d044fb9 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -20,7 +20,6 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 위의 정의된 모델에 따라 전체 애플리케이션 및 API의 위험을 평가하고 우선순위를 결정한 뒤, 결과를 구성 관리 데이터베이스(Configuration Management Database, CMDB)에 등록한다. * 적용 범위와 요구되는 엄격도 수준을 정의하기 위한 가이드라인을 수립한다. -* Establish assurance guidelines to properly define coverage and level of rigor required. ### 2. 탄탄한 기반을 통한 실행 체계 확보 @@ -38,9 +37,9 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 구현 및 검증 활동에는 위협 모델링, 안전한 설계 및 설계 검토, 시큐어 코딩 및 코드 리뷰, 침투 테스트, 그리고 취약점 조치가 포함된다. -* 개발 및 프로젝트 팀이 각 활동을 성공적으로 수행할 수 있도록 주제별 분야 전문가(subject matter expert)와 지원 서비스를 제공한다. +* 개발 및 프로젝트 팀이 각 활동을 성공적으로 수행할 수 있도록 주제별 분야 전문가와 지원 서비스를 제공한다. -* 현행 시스템 개발 수명 주기(system development life cycle)와 모든 소프트웨어 보안 활동, 도구, 정책, 프로세스를 검토한 후 이를 문서화한다. +* 현행 시스템 개발 수명 주기와 모든 소프트웨어 보안 활동, 도구, 정책, 프로세스를 검토한 후 이를 문서화한다. * 새로운 소프트웨어 개발 시에는 시스템 개발 수명 주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서 수행 가능한 다양한 활동을 제시한다. 제시된 활동을 수행하여 모든 새로운 프로젝트 또는 소프트웨어에 조직의 요구 사항에 부합하는 보안 수준이 제공되도록 한다. @@ -60,7 +59,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 지표를 기반으로 관리하라. 수집된 지표 및 분석 데이터를 기반으로 개선 활동과 예산 의사결정을 추진한다. 지표로는 보안 관행 및 활동 준수, 신규 취약점 유입, 취약점 조치, 테스트된 애플리케이션 범위, 결함 유형별 밀도 및 발생 건수 등이 있다. -* 구현 및 검증 활동에서 축적된 데이터를 분석하여, 근본 원인(root cause)과 취약점 패턴을 식별하고, 전사 차원의 전략 및 시스템적 개선을 추진한다. 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공한다. +* 구현 및 검증 활동에서 축적된 데이터를 분석하여, 근본 원인과 취약점 패턴을 식별하고, 전사 차원의 전략 및 시스템적 개선을 추진한다. 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공한다. ## 반복 가능한 보안 프로세스 및 표준 보안 통제 수립 및 적용 @@ -83,7 +82,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 기획 및 설계 단계를 포함하여, 모든 기술 요구사항의 충족 여부를 평가한다. -* 설계, 보안, 서비스 수준 계약(service level agreements, SLA)을 포함하여 모든 기술 요구사항을 협의한다. +* 설계, 보안, 서비스 수준 계약(SLA)을 포함하여 모든 기술 요구사항을 협의한다. * [OWASP 보안 소프트웨어 계약 부록](https://owasp.org/www-community/OWASP_Secure_Software_Contract_Annex)와 같은 템플릿 및 체크리스트를 적용한다.
**참고:** *해당 문서는 미국 계약법을 전제로 하므로, 해당 문서를 사용하기 전에 자격을 갖춘 법률 전문가의 자문을 구한다.* @@ -103,10 +102,10 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 개발자와 함께 데이터 흐름(data flow)을 검토한다. -* 기존 사용자 스토리(user story)에 보안 사용자 스토리를 추가한다. +* 기존 사용자 스토리에 보안 사용자 스토리를 추가한다. -### 안전한 개발 수명 주기(Secure Development Lifecycle) +### 안전한 개발 수명 주기 * 조직이 애플리케이션 및 API를 구축할 때 따르는 프로세스를 개선하기 위해, [OWASP 소프트웨어 보증 성숙도 모델(SAMM)](https://owasp.org/www-project-samm/)을 권장한다. 이 모델은 조직이 직면한 특정 위험에 맞춘 소프트웨어 보안 전략을 수립하고 구현하는 데 도움이 된다. @@ -114,11 +113,11 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 코드 리뷰를 수행한다. [OWASP 치트 시트: 시큐어 코드 리뷰](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html)을 참고한다. -* 개발자에게 보안 도구를 제공하고 사용 방법을 교육한다. 특히 정적 분석(static analysis), 소프트웨어 구성 분석(software composition analysis, SCA), 시크릿 및 [코드형 인프라(Infrastructure-as-Code, IaC)](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) 스캐너 도구를 포함한다. +* 개발자에게 보안 도구를 제공하고 사용 방법을 교육한다. 특히 정적 분석, 소프트웨어 구성 분석(software composition analysis, SCA), 시크릿 및 [코드형 인프라(Infrastructure-as-Code, IaC)](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) 스캐너 도구를 포함한다. * 개발자가 보안상 안전한 선택을 기본으로 하도록, 가드레일을 적용한다. -* 강력하면서도 사용 가능한 보안 통제를 구축하는 것은 어렵다. 가능한 경우 안전한 기본값을 제공하고, 가능한 경우 '포장된 도로(paved roads, 가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것)'를 만든다. [OWASP 치트 시트](https://cheatsheetseries.owasp.org/index.html)는 개발자에게 좋은 출발점이며, 많은 현대적 프레임워크는 인가(authorization), 검증(validation), 교차 사이트 요청 위조(CSRF) 방지 등과 관련한 표준적이고 효과적인 보안 통제를 제공한다. +* 강력하면서도 사용 가능한 보안 통제를 구축하는 것은 어렵다. 가능한 경우 안전한 기본값을 제공하고, 가능한 경우 '포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것)'를 만든다. [OWASP 치트 시트](https://cheatsheetseries.owasp.org/index.html)는 개발자에게 좋은 출발점이며, 많은 현대적 프레임워크는 인가, 검증, 교차 사이트 요청 위조(CSRF) 방지 등과 관련한 표준적이고 효과적인 보안 통제를 제공한다. * 개발자에게 보안 관련 IDE 플러그인을 제공하고 사용을 권장한다. @@ -154,11 +153,11 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 사용자의 보안 인식을 제고하고, 사용성과 보안성 간의 상충을 관리한다. -* 변경(changes)을 계획하고 관리한다. 예를 들어 애플리케이션의 신규 버전 또는 OS, 미들웨어, 라이브러리와 같은 기타 구성요소로의 버전 업데이트를 포함한다. +* 변경을 계획하고 관리한다. 예를 들어 애플리케이션의 신규 버전 또는 OS, 미들웨어, 라이브러리와 같은 기타 구성요소로의 버전 업데이트를 포함한다. * 모든 애플리케이션이 인벤토리에 등록되어 있으며, 모든 중요 세부사항이 문서화되어 있음을 보장한다. 구성 관리 데이터베이스 및 보안 아키텍처, 통제항목, 대응방안, 런북(runbook) 또는 프로젝트 문서를 포함한 모든 문서를 최신 상태로 유지한다. -* 모든 애플리케이션에 대해 로깅, 모니터링, 알림(alert)를 수행한다. 누락된 경우 추가한다. +* 모든 애플리케이션에 대해 로깅, 모니터링, 알림을 수행한다. 누락된 경우 추가한다. * 효과적이고 효율적인 업데이트 및 패치를 위한 프로세스를 수립한다. @@ -184,7 +183,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 필요한 데이터는 아카이빙해야 한다. 그 외 모든 데이터는 완전 삭제해야 한다. -* 미사용 계정(account), 역할(role), 권한(permission) 삭제를 포함하여 애플리케이션을 안전하게 폐기 처리한다. +* 미사용 계정, 역할, 권한 삭제를 포함하여 애플리케이션을 안전하게 폐기 처리한다. * 구성 관리 데이터베이스 애플리케이션 상태를 폐기 변경한다. @@ -280,7 +279,7 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 - Tool support + 도구 지원 기본적인 From b33e6a8b55c066d2c1d1cde45ca1d619e6207a3c Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:25:45 +0900 Subject: [PATCH 102/167] Align with other documents --- 2025/docs/ko/0x00_2025-Introduction.md | 4 ++-- 2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 8abafeaee..d776429e0 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -51,7 +51,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! 이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트 된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE의 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 이번 버전에서도 CWE의 발생 빈도를 분석에서 제외한다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 퍼져있는 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경이 불가피하였다. -CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(Root Cause) 유형과 증상(Symptom) 유형이 있다. 근본 원인의 유형에는 "암호 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근분 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. +CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(root Cause) 유형과 증상(symptom) 유형이 있다. 근본 원인의 유형에는 "암호 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근분 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다.모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않는 경우 도구, 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 인젝션, 커멘드 인젝션, 크로스 사이트 스크립팅, 하드코딩된 패스워드, 검증 부재, 버퍼 오버플로우, 민감 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. @@ -62,7 +62,7 @@ MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하 CVSSv2에서는 Exploit과 (Technical) Impact 모두 최대 10.0까지 가능하였으나, 공식에 따라 Exploit은 60%, Impact는 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 Exploit 6.0, Impact 4.0으로 제한되었다. 가중치를 고려한 결과, Impact 점수는 CVSSv3에서 평균적으로 약 1.5점 상승하였고, Exploitability는 평균적으로 약 0.5점 하락하였다. -OWASP Dependency Check에서 추출한 National Vulnerability Database(NVD) 데이터에는 CWE에 매핑된 CVE 기록이 약 175,000건(2021년 125,000건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년 241개에서 증가)이다. 추출된 약 220,000건의 CVE 중 160,000건은 CVSS v2 점수를, 156,000건은 CVSS v3 점수를, 6,000건은 CVSS v4 점수를 보유하고 있다. 다수의 CVE가 복수의 점수를 보유하고 있어 합계가 220,000건을 초과한다. +OWASP Dependency Check에서 추출한 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD) 데이터에는 CWE에 매핑된 CVE 기록이 약 175,000건(2021년 125,000건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년 241개에서 증가)이다. 추출된 약 220,000건의 CVE 중 160,000건은 CVSS v2 점수를, 156,000건은 CVSS v3 점수를, 6,000건은 CVSS v4 점수를 보유하고 있다. 다수의 CVE가 복수의 점수를 보유하고 있어 합계가 220,000건을 초과한다. Top 10 2025에서는 다음과 같은 방식으로 평균 Exploit 및 Impact 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 보유한 비율과 CVSSv2 점수를 보유한 나머지 비율에 따라 Exploit 및 Impact 점수에 가중치를 부여하여 전체 평균을 산출하였다. 이 평균값을 데이터셋의 CWE에 매핑하여 위험 산정 공식의 나머지 절반인 Exploit 및 (Technical) Impact 점수로 활용하였다. diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index f5669674f..aeda41cec 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -62,7 +62,7 @@ CVSSv2에서는 악용과 (기술적) 영향 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 악용은 60%, 영향은 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 악용 6.0, 영향 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. -OWASP Dependency-Check에서 추출한 결과, 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)에는 CWE에 매핑된 CVE 레코드가 약 17만 5천 건(2021년의 12만 5천 건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년의 241개에서 증가)이다. 추출된 약 22만 건의 CVE 중 16만 건에는 CVSS v2 점수가, 15만 6천 건에는 CVSS v3 점수가, 6천 건에는 CVSS v4 점수가 있었다. 다수의 CVE가 여러 버전의 점수를 동시에 보유하므로, 점수 건수 합계는 22만 건을 초과한다. +OWASP Dependency-Check에서 추출한 결과, NVD에는 CWE에 매핑된 CVE 레코드가 약 17만 5천 건(2021년의 12만 5천 건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년의 241개에서 증가)이다. 추출된 약 22만 건의 CVE 중 16만 건에는 CVSS v2 점수가, 15만 6천 건에는 CVSS v3 점수가, 6천 건에는 CVSS v4 점수가 있었다. 다수의 CVE가 여러 버전의 점수를 동시에 보유하므로, 점수 건수 합계는 22만 건을 초과한다. Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화한 뒤, 악용 점수와 영향 점수 모두에 대해 CVSSv3 점수를 보유한 비율과 나머지 CVSSv2 점수 보유 비율을 가중치로 적용하여 전체 평균을 산출하였다. 이렇게 산출한 평균을 데이터셋의 CWE에 매핑하여, 위험 방정식의 나머지 절반에 해당하는 악용 및 기술적 영향 점수로 사용하였다. From 5f50b9f3a4e17f91a1e447da55173a397a61a3f4 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:26:23 +0900 Subject: [PATCH 103/167] typo --- 2025/docs/ko/A01_2025-Broken_Access_Control.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md index 1e12565cd..4f20390e9 100644 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -80,7 +80,7 @@ * 애플리케이션의 고유한 비즈니스 제약사항은 도메인 모델에 의해 검사한다. * 웹 서버의 디렉터리 리스팅(directory listing)를 비활성화하고, 웹 루트(web root) 내에 파일 메타데이터(예: .git) 및 백업 파일이 존재하지 않도록 해야한다. * 접근 제어 실패를 로깅하고 필요한 경우(예: 반복적인 실패 발생 시)에 관리자에게 알린다. -* 자동화된 공격 도구로 인한 피해를 최소화하기 위해 API 및 컨트롤러 접근에 대한 속도 제한(Rate limit)을 구현한다. +* 자동화된 공격 도구로 인한 피해를 최소화하기 위해 API 및 컨트롤러 접근에 대한 속도 제한(rate limit)을 구현한다. * 상태기반 세션 식별자는 로그아웃 후 무효화 한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격을 위한 기회를 최소화하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려하며, OAuth 표준에 따른 토큰 취소도 고려한다. * 간단하고 선언적 접근 제어를 제공하는 확립된 툴킷과 패턴을 사용한다. From 356bb2fb7c80b6ad80f3fff6fe842db5957266f7 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:27:28 +0900 Subject: [PATCH 104/167] typo --- 2025/docs/ko/A02_2025-Security_Misconfiguration.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index c8825d6f2..82678f0e5 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -3,7 +3,7 @@ ## 배경. -지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트된 모든 애플리케이션에서 잘못된 설정 중 한가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 취약점 발생률은 3% 이며, 총 CWE는 1,375개이고 71만 9천(719k)개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 `CWE-16: 설정` 그리고 `CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)`가 있다. +지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트된 모든 애플리케이션에서 잘못된 설정 중 한가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 취약점 발생률은 3% 이며, 총 CWE는 1,375개이고 71만 9천개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 `CWE-16: 설정` 그리고 `CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)`가 있다. ## 점수표. @@ -64,7 +64,7 @@ * 애플리케이션 스택 전반에 적절한 보안 하드닝이 적용되지 않았거니, 클라우드 서비스 내 보안 설정이 잘못 구성되어 있는 경우. * 불필요한 기능이 활성화 또는 설치된 경우. (예: 불필요 포트, 서비스, 페이지, 계정, 테스트 프레임워크 또는 권한) * 기본 계정, 패스워드가 활성화되어 있거나 변경되지 않은 경우 -* 과도한 에러메시지를 처리할 공통 설정이 부족하여 에러 처리 과정에서 스택 트레이스(Stack trace)나 과도한 에러 정보 메시지가 사용자에게 전달되는 경우. +* 과도한 에러메시지를 처리할 공통 설정이 부족하여 에러 처리 과정에서 스택 트레이스(stack trace)나 과도한 에러 정보 메시지가 사용자에게 전달되는 경우. * 업그레이드된 시스템에서 최신 보안 기능이 비활성화 되어 있거나 안전하게 설정되지 않은 경우. * 이전 버전과의 호환성을 우선시하여 안전하지 않은 설정을 하는 경우. * 애플리케이션 서버 내 보안 설정, 애플리케이션 프레임워크(예: 스트럿츠(Struts), 스프링(Spring), ASP.NET), 라이브러리, 데이터베이스 등에서 보안 설정이 되지 않은 경우. @@ -94,7 +94,7 @@ **시나리오 2:** 서버에서 디렉토리 리스팅이 활성화 되었을 때 공격자는 단순하게 디렉토리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드 할 수 있고, 이런 클래스들을 디컴파일 하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. -**시나리오 3:** 사용자에게 반환되는 스택 트레이스(Stack trace) 같은 자세한 에러 메시지가 표시되도록 설정되어 있는 경우 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. +**시나리오 3:** 사용자에게 반환되는 스택 트레이스 같은 자세한 에러 메시지가 표시되도록 설정되어 있는 경우 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. **시나리오 4:** 클라우드 서비스 제공자(Cloud service provider, CSP)는 인터넷에 자원을 공유하는 권한이 기본 설정이다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. From 6da829a546ef8bb22a237b1e2292b64047935902 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:28:45 +0900 Subject: [PATCH 105/167] typo --- 2025/docs/ko/A05_2025-Injection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index 8640f4162..a8b73887e 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -2,7 +2,7 @@ ## 배경. -인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화(크로스 사이트 스크립팅)에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향도가 낮아졌다. +인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화('크로스 사이트 스크립팅')에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향도가 낮아졌다. ## 점수표. From d42d8736968cd6f9aa7a6349d754456b467f9675 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:30:12 +0900 Subject: [PATCH 106/167] Refine language for clarity and consistency --- 2025/docs/ko/A06_2025-Insecure_Design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 0dad83da3..1a2b4f221 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -3,7 +3,7 @@ ## 배경. -안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, Secure by Design의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. +안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, 설계상 안전(Secure by Design, SbD)의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. From d9fbbb04ff863a1767ded7419f8120c46e535c9a Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:30:55 +0900 Subject: [PATCH 107/167] Refine language for clarity --- 2025/docs/ko/A06_2025-Insecure_Design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 1a2b4f221..fbe4d4d2b 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -73,7 +73,7 @@ ### 안전한 설계 -안전한 설계는 지속적으로 위협을 평가하고, 알려진 공격 기법을 방지하기 위해 코드가 견고하게 설계되고 테스트 되도록 보장하는 문화이자 방법론이다. 위협 모델링은 요구사항 개선(refinement) 단계(혹은 유사한 활동)에 내재화되어야 하며, 이 과정에서 데이터 흐름과 접근 제어 또는 기타 보안 통제의 변화를 중심으로 검토해야 한다. 유저 스토리를 작성할 때 정상 흐름과 실패 흐름을 결정하고, 책임 당사자 및 영향받는 당사자가 이를 충분히 이해하고 합의했는지 확인하라. 또한 정상과 실패 흐름에 대한 가정과 조건을 분석하여 정확하고 바람직한 상태로 유지되는지 확인하라. 올바른 동작을 위해 필요한 가정과 조건을 어떻게 검증하고 강제할지 결정한다. 이 결과는 유저 스토리에 문서화되어야 한다. 과정 중에 발생하는 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공하라. 마지막으로, 안전한 설계는 개발이 완료된 이후에 추가할 수 있는 부가 기능도 아니고 도구도 아니다. +안전한 설계는 지속적으로 위협을 평가하고, 알려진 공격 기법을 방지하기 위해 코드가 견고하게 설계되고 테스트 되도록 보장하는 문화이자 방법론이다. 위협 모델링은 요구사항 개선 단계(혹은 유사한 활동)에 내재화되어야 하며, 이 과정에서 데이터 흐름과 접근 제어 또는 기타 보안 통제의 변화를 중심으로 검토해야 한다. 유저 스토리를 작성할 때 정상 흐름과 실패 흐름을 결정하고, 책임 당사자 및 영향받는 당사자가 이를 충분히 이해하고 합의했는지 확인하라. 또한 정상과 실패 흐름에 대한 가정과 조건을 분석하여 정확하고 바람직한 상태로 유지되는지 확인하라. 올바른 동작을 위해 필요한 가정과 조건을 어떻게 검증하고 강제할지 결정한다. 이 결과는 유저 스토리에 문서화되어야 한다. 과정 중에 발생하는 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공하라. 마지막으로, 안전한 설계는 개발이 완료된 이후에 추가할 수 있는 부가 기능도 아니고 도구도 아니다. ### 보안 개발 생명주기 From e7e032478c6bea9421d69f5f0122879ed9b48f6b Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:32:50 +0900 Subject: [PATCH 108/167] Improve clarity and consistency --- 2025/docs/ko/A07_2025-Authentication_Failures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index 81e55855a..f27b62003 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -100,13 +100,13 @@ * 계정 열거 공격에 계정 존재 여부가 드러나지 않도록 회원가입, 비밀번호 복구, API 응답 메시지를 결과와 무관하게 동일(예: "올바르지 않은 유저명 혹은 패스워드")하게 유지한다. -* 로그인 실패에 대해 횟수 제한 또는 점진적인 지연을 적용하되, 과도한 통제로 DoS(denial of service)가 유발되지 않도록 설계한다. 또한 실패 이벤트를 로깅하고 크리덴셜 스터핑이나 무차별 대입 공격 징후 탐지 시 관리자에게 알림을 발송한다. +* 로그인 실패에 대해 횟수 제한 또는 점진적인 지연을 적용하되, 과도한 통제로 서비스 거부 공격이 유발되지 않도록 설계한다. 또한 실패 이벤트를 로깅하고 크리덴셜 스터핑이나 무차별 대입 공격 징후 탐지 시 관리자에게 알림을 발송한다. * 세션은 높은 엔트로피를 가진 새로운 무작위 세션 ID를 생성하는 서버 측의 안전한 내장 세션 관리자를 사용한다. 세션 식별자는 URL에 포함되지 않아야 하며, 쿠키에 안전하게 저장되고, 로그아웃하거나 유휴 시간 및 최대 세션 시간 초과 시 무효가 되어야 한다. * 가능하면 인증, 아이덴티티, 세션 관리를 자체 구현하기보다 사전 제작된, 신뢰할 수 있는 시스템을 사용한다. 가능하다면 검증되고 충분히 테스트된 도구를 구매/활용해 구현 위험을 줄인다. -* 제공된 자격 증명의 의도된 용도를 검증한다. 예를 들어 JWT의 경우 `aud`와 `iss` 클레임(claim) 및 스코프(scope)를 검증한다. +* 제공된 자격 증명의 의도된 용도를 검증한다. 예를 들어 JWT의 경우 `aud`와 `iss` 클레임 및 범위를 검증한다. ## 공격 시나리오 예시. From db098de456f8bc3bee400216f042abcf075ed897 Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 02:34:02 +0900 Subject: [PATCH 109/167] Refine language for clarity and consistency --- 2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index 7e944d019..da4b22676 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -2,7 +2,7 @@ ## 배경. -소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 *및* 데이터 무결성 실패"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 해당 카테고리는 소프트웨어 공급망 실패(Software Supply Chain Failures)보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 CWE로는 *CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함(Inclusion of Functionality from Untrusted Control Sphere)*, *CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정(Improperly Controlled Modification of Dynamically-Determined Object Attributes)*, *CWE-502: 신뢰할 수 없는 데이터의 역직렬화(Deserialization of Untrusted Data)*가 있다. +소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 *및* 데이터 무결성 실패"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 해당 카테고리는 소프트웨어 공급망 실패보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 CWE로는 *CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함*, *CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정*, *CWE-502: 신뢰할 수 없는 데이터의 역직렬화*가 있다. ## 점수 표. @@ -65,7 +65,7 @@ * npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 저장소만 사용하도록 보장한다. 위험 수준이 더 높다면, 잘 검증된 내부 저장소를 호스팅하는 방안을 고려한다. * 악의적인 목적의 코드 또는 설정이 소프트웨어 파이프라인에 유입될 가능성을 최소화하기 위해, 코드 및 설정 변경에 대한 검토 절차를 마련한다. * 빌드 및 배포 과정에서 흐르는 코드의 무결성을 보장할 수 있도록, CI/CD 파이프라인에 적절한 분리(격리), 구성, 접근 제어를 적용한다. -* 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 수신된 뒤, 변조 또는 재전송(replay)을 탐지하기 위한 무결성 검사나 디지털 서명 없이 사용되지 않도록 보장한다. +* 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 수신된 뒤, 변조 또는 재전송을 탐지하기 위한 무결성 검사나 디지털 서명 없이 사용되지 않도록 보장한다. ## 공격 시나리오 예시. From 421bf4a17614f3b35f3135d19608e838da34417c Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Tue, 6 Jan 2026 14:25:21 +0900 Subject: [PATCH 110/167] Modify index.md typos --- 2025/docs/ko/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index e8d9798e6..d382d1e24 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -24,7 +24,7 @@ OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제 ### Top 10:2025 목록 -1. [A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md) +1. [A01:2025 - 불충분한 접근 제어](A01_2025-Broken_Access_Control.md) 2. [A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md) 3. [A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md) 4. [A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md) From b2e693b611df202a8e56213a6d2e181ffc908361 Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Tue, 6 Jan 2026 21:11:32 +0900 Subject: [PATCH 111/167] Top10Mapping image Korean Translations --- 2025/docs/ko/assets/Top10Mapping-ko.PNG | Bin 0 -> 91572 bytes 2025/docs/ko/assets/Top10Mapping-ko.xlsx | Bin 0 -> 10376 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 2025/docs/ko/assets/Top10Mapping-ko.PNG create mode 100644 2025/docs/ko/assets/Top10Mapping-ko.xlsx diff --git a/2025/docs/ko/assets/Top10Mapping-ko.PNG b/2025/docs/ko/assets/Top10Mapping-ko.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f8a7ab8f036897ec0145e8d2c716db3efc613abb GIT binary patch literal 91572 zcmb@u2QZvp7Y9rdk|5DZ^eEA-E_y@@f)Kr|C_&Wd-3rlL^ypo%SiQ4)FVVY=UKSf= zwN<{A|NDR6ugrWi-^_Ps*x7yddG2ZV+;h(F+zoxNBL4)30tW*F{QZ!pS6sCLkA9#}{zOJQJCMB`o=W1-(a{_ zuYI8z`okB_vO3Pvj-QO3Kik{UX?(W*gu%36$HOhcBPhbdS6OpajDd0M zt{@|&;SSup#!VyHNEW;?a{7pIUk0n2iJqc>ki_7HRR>`z)`PN+==-?^$7B1qoll zeRqoviVt=Vb|@qaX_l~Y;x zNOoFXH+24^% z@56qBr)B?QUoL+W?+-fh7zspQ*oEJTfhb&$z|K~{*Mq&z#UVboxQwur z)7J%1ZTDf3=?CEhtrT&J8?xhu#G_)7>L4T_TNxhnh4how0$(4XSxc(5Bbp3OZunO+ zIR?li5IG^?6AX?aV#4Rp^QkG#IbXtv4>bh4+8w_JAAw2r%!u>ar5pJZ8(d7|M?2|{ zh2EFAU16teoK}b7NK)kC=GPEvO0>lORUHfSH5?{8Fsaa=sVXzsd#A$q{JsL0_fQa5 zO452#yW+vCywQO@W-68bX&^E|PypSsrJ<<-&oM)GEkKX8yfXg&+EdXqIxa z6OanUQAv+)ehZZNTC}& z!#8Hyaro=8UwX!~k&kg1Ein8gav;g~5RpUhCi|rZ%DWJ+{FSPV5AB_e_dkQ;Xs)q z^phHouqtMHHj=ybV<6*SQ)`6XX{mf}`zu&!65;LjYcu~jgEG+ja{r$dgDh!9A#%Eq z8ylL1);6;B?HnUQrFib6=x6L=-RV+ThM=VM8>F%S{8Rb8Co2bwVe8XvIeACT;{QlH z4G9C0C(M-k8QFcCHYR32mYEE`6FLd0jBP&tl=6$uqp$0mrlix}Jpy<=R&b_XPZ>V_ zXL;fjL2sM-c306;E!>%-dV~>nc(L&f*E2ac>-0fDgzLtSJZYk{yn1uK%FpSC?8S#E zNnJ+e$vgi(Ao7-ro_?40ug&?_^Z){SGK-w>(u>K8aTy5}$0&#dnO_)NEi&fW)XM)A zo5tJwYcN@whvP(qNZvaU(PNhIgDAUF-uXT+(X%us7c7-&D;4fKZ5%8f(p0SdkGk06 zF^>@R;930JH?uIsnO{gD!Wiwd`o=XPb8>Rxl|C8Z zzV%q5D1=FEB>l27I@$7`+5}{h-jMOXMEP)s|3`JC8lZDGwL%5kUW;2{BY|DbeCWNK zM1zNYM1-U?ceW(VDsO20jPr@_+Kgl>dWq?ESSnvG{NrZFUXR7yaus(}CSsqnQ|a^8 zYG$ioeCsUjSG`9-hFg8!&*HWJ*!%x+5BPs0p(u%}Z60NwwK`&N+60_{>Y$(xtnqg=6>K|O z+$bcyV7cznkR8onnm{OEUlm#)slRY`9$Bgsf#UlO^L!0?@s~AR`bQdM*@cBl#%a*1BP4~t5| zf}5aA7PwK;7XvcBx$tG1p6f>xGO|r%X62&^OtyM{r*3C_&a zeDu~KgZ9NT;U&+>^61+!tl0Od>khu)`b30+F_M6KbSZdiI3$ zD2tZ!akNWrO__nXfc}O{>0?N;>tmtU`|45}Suge~hnn^Sm`-c1BVkBw9Ip_Blr%XV;<{Egt#i9hW6}Vm}BHgn; zk;Ay^8J2zKw@z~zOtgq5z>f>zq}9Tj$;Cnt&JVqo_G=3>T~FMR8Og2gOY<}O1~~6; z75;CB!POpT_oa^FUKAx(GbsVIJaofcC4WHXu1#BtWlo>W= zjY~(=rU-tyP`&K*vR>xnc`eimaSjqx6)*jc!Taj}f@uKG)TQe^=0LD4K71d(eniPyEE| zSK^Jq1jhF(v$w@e`$jFrJ@tr8myXU28I15N8GZ~8wjpSRbvPTZDz#hk;Vmf2qS^T# z;zp3HsN?99jt((;>u9D zY-&$z)!l<@X1BTMT!Ab>J6)H|8m%q4bqNnF1b3V3k>O+8__Af2mL zAx&my%Tt{Ch6Gv-w(Fg1NVT9{vd)UYVvgu%Y2+WKqWEO23wlG68TKlo_5zn4T=a&4 zB8VcJ?y&s)ClxiOv7gbNK6SHI-tso}!plK6VBcfp&J^Qi56`=`-i^w3y{b+4ORrah zXSQ~|YoV9EXNfE2+=GjGg?7)Smnes7?8zR^R?jVkyGSD-xTBd%a7}Jue$2 zhtjS!`FGwNXOL%xdPxfJfzTn~I?CrvHn_G(Crfr%Qpgu`+OY3ZXJG2V4XQPAU)a?f zP@=%`o!PKbcO#K5!0if##D&YF1=y-36w4 zJmhvuXX*rXI7g(u)jENHY&fl?>ZcYTE&#LcBHG4ZRC;x+2iNQ6x4O3W-$Nc~a(st0 zK7O(GsF=&lhhxLae_%jwT`%*jj*+Y{j%zN>GDIcaqkhF{eC7>htTnOP{%x`KB{2oqgzC z3K7{+H@eguq5^B1e-a}b%}5Z#`7|$}!vbo(V54H1DmjxJ-2Z&x1zRQ+G`+!C{@#3D z3KMji*Ivpt`C2fd6NXBXjOgB?kjxPo7s|5h`80dHIqHxU#u7tyE3cW|q)M8cKLMJ$ zx5&gJdvqNVi>gH6{vQ2;Ej<$9)2P(_?l~;oYK=A&y-Mt5A${Df(MpD4lUTzb=DUqz z)~@l2mgjby0*{q-!rE_Uc{vz$14mTsh@Wb=MDD)o6o7#!N zg-M_2Y--`L&p_hxP^~!~(bzlc_O>z!s*oW?;oaS08?2*Onz-4DRoO{|TI|(-8Jts2 zkH5OWdOsU+@rXXQj*=ea~}BS{f%%B_lw z%(dqHoo<@`K$t#wh_L~Zp2nQ_;r+Bc8Q#!lW>wdR+%LKHF?fNN@L2T;SjPsgj`%FR z530RvLygd~zxjkorm*ZA?%YSYuIRTx`Rk-XpZi1Dk=k0txf4D^^%bUOmXOmG;zQtp z>~3CLo%pB#%d_YAz#`X?i0+7oKrb}(n{nGz--$CRp_)-b0XOu?=(gP=*k$YdA}QHH&`ZxZt-8q4oO9b`N>_t$ASyu z&!kr8U>AQy-iuTTA>6Irbe&g5Dka-0CwU+tGp?_;s0NZzO%>=!SdtH~sh;`D!M4O( z2j2y{kQ!DxID*}E1sSl5jrRL$lXDgkflx=L)-M~55frY8KwK*Ei>DO&+FAWNm6T5@ zyF8a7!MjI6M;_*B%7wlzVaA|qk+<39x(g#-gB^6Jl6g2aEh7#BNVWnz&YJ{6bU{XuxmS+kN(Lbz*in;#7fVoqCMl*Kxl-=D z(Ciqy9m!@U5HRR*(W*`lFb^lh;{}Q}z0}^5>K#}&{qPmyp1y_m$|=mp>;7alBt`Zr z->7@3Xw}C+;pHu7z1L2s)gP-%V$48uA7(olrvs9ry@dD;BreePzM}n9q>Q`JS0r;=W&oRMQOgzBdFlZZdA0P z*kNQ_;1#}B$**W`QW3<;nvtQ*VMF=dXijcG;qbLeeou+^+}XyPTwYd6Jm}&|FJwIx^y_g5q zx`GzwI5T=TfT;fO8S^S>24xtJe9D3)q8*fm*&m+74nGdw*Ju0*YqoVkFqe~VZJ23( zbPBp}e0=zP7fiTn@htBW4@G8;aT2)+(qF_DzstowcLqnipF2j*2!7n_n?<HNwws;R`CU`6W5LdG`g%CitgJiP&=;la^?zj?bN@ zYx4>lP7<%2Q{>N#$c3n}#>EiOw+$_fN7t?Svnf)}N-xQ#_kO9d1)(K|zi`usCtxP9 zv6Xa!2)rp<->BjT!dqb`9gBdxOnJHhH_#QsZ(Pq`WlT$MV1Q3hOATO}C*=_14d`0G z2LC`Z^Bne7sFtfeC(&^Ewv3oCh8fUunO9*mbry2@(|SNMu;GIQ80VslQAt5Hj=&jnP>}G{sC%C?&W!RFGh`Kijv#qoxlHUP z6wV~*fRyT@IQsob^!Y;U`oEb%J*`B=Idt^%f=XWAUg0U+0=E&0z}C(lYt6D=CicYq z%uY1z_J)s3#sXY9cWzXW`J?4^r`;lQH)PHL1ITIn^%n81D8XZm4sBY+Yr_}xy8*Fe zo29EndE5!V64*P%$?5(S=x2|6?(t4?MzcQ>ap%z5YCVm02yiH9DqD$dQswY~;@F_8Mz zZd$=>NXR1{JM3d!6NTx(nYQ6}J7EuK*|v!JY5HByB)fv!aZyE;+-9FyI|52RH5XpAk}VL-~F8Sm}zU3SGmw){JFIy>IC=M&-8~QBl#gYIEBB z!}whglZZ~mPpY<4`NVA-JJ$M*ABGvOx5v%mLh2l~-QT(Z*UW->wBOx-q)-m;ol>Jc z7aOVq_+9L{r7iCf2kQG6oi5zV36|>vdR3C4`96f{bKTW}Js8Zuy%v7iwaBrkZhLih zFpTv1R$$V zn#A^Rw(Pw&T-dW5OQhlD{l4Y-IyT{tLyay~ZQe@K9ddK}lHwCv6$g!4NKUt|CnK<4 z%6^;+j>w5BK`4KsYl1e3D~z(Sbj4QdOXz^hqWnOC5f_pj-zTf0gQiO-8M*Z8pS<-YlRnfP3NCuVsLci4=4bkQZ!9WX7@M0B{FxsvqdxjD zf7p@W(;nBn!J}Df?mm|_BR}n{sGxLvUeFN?-}1#wnCP*%5N@iF7!@NKFYg-1#1 zvXh3)I4!Tv9TyG+H3?JyV?rDd>wNh0B5mC50bDd$@hrI^w(Lk*r^PY-&|a>8WCqMh zO4=jznT@PeC&)u{Lzo623ZLEB!SQ?hpna;&WP=9f#eKR2eZ-zPEUj4*xm@st`dHV+ zVrv62`8r`1)BdP616@R$G-@E*5*ckto@ZWzc^<5(=`nmI1q4%KZHw{=fs za11T1c{exU;abzE_^LB9cyJ9_$by(Jt&M@b{p%+_BSOMbmGEBo&2Dab`vb)*yB%Wj zjU=N0ee=;H_o0cj_$m_@s@_O6N|JN)aWi=W$(hqJ=k^Ed%4X~A&nfC5l42swX|!Xp z5|(}b&DLONE)%0bSRefVB&+DGm#gl2)Z1&vBXZ`jj2ZX%^cAf=TZD4;OG(z)7%}qA zsvIcsbqzOU&FtvRXXHMbuFnF~5OhH&`~9jLxI=7=&t>cl2N?W+ql@B|L5@xB%5%f= zgw=Tc2Qtn@4P#gB)X;9%<3!$L$S~4t+0*cPXR}S;Ttnqzwu7v!Rx;KjMl9)i)ZDAZ zcyr4@V$?Yt>0x1VR%glsShJHc9L6ruKRB8nj6@13ReVX4VchSy++@=6dfVdvQ2l+v z+vIl{eC2zebw7qrD^%sx59A>D7;@OOINJ<4C3`*Va+<#*?J1(`7Qf2&c%4dCDocKU zSHc1Sxf!bBD5Ka8GL5e;Hhpv^X-)jlCC5T}D$$FlzDHMV{Iz9YNHze^fI;?#f5hGg$hpDh;x)Ws=B9%kS}*3T2RfsQG0;>nUufFSwF4tUf=f5XfnO zWz7eO-KxBuvjMbl4-G5Jwm#L?%pKfHwyTgpynA4cW{}jEzxo^D)23$ESsmCo1}G3G zT|+U0Plm2qb9K zeKg^-Q@V+)$3+v|Q@ya5a2N6#4IAAM+?SDw&+h8DI)D{-@P1(^Q<?3gJYH~ZO;m^xTeu!|^=f%7vS}DzTST@)HqwV# zvScG+VLXh@&w0&8rt~gy;q{VJByz&8eMyP7N2LF_hwDLY9(%zl_Re>~C|S9{Io*1F z6$z5x1HtX)Ca7(xIy`Uq*?II->5Y!Ufv?&N}uDIWo}P(E2&wE1Mr(^s4fV{1j+oTx)Bg{8IMF=1g*7Ki`-X zwPN(6F3NuAha2a7fgZ12MKoR3(~z|F$GLaF6VZn?SIdZm4NVtI8(UeOqh`W4*SoFH zVgc0SJr#Y0-1>oX!WV6`Khm(QeF_Ena(>%eO6jOo$;;X>J*k5I9W7h^oIbI9ZXL#eY*^lshLK+`8Y*XvP8`u z(o!Ls7@h%LofceVr=B?TSr}`$?J46l7uxqAH>*$IJC#K3KXG=9?L~!#9RpHx!;0MD z_;aZrbyu)0t$ zj>3fvc8Wv~mV5B*kf4_qpMVhj>}BoH*W6kJ;SWq3wlCQ2u+-3WC)7lZT%!R#G})61 z&+V9-u19^nDsOA7M5D%y84E?)hdte~C~!QVbj$Y3LAyi!`eec zgle!=jv;+&SUuj1(Prs)3eKD!m!wQdl#!Z{irxO3EMc;$io!V#D~Der`h5P~wl%KOfSTGGEb zy36eOzwe3tsossP!*@^DIi+cJSiUv!JtSt?c~vq)p*T7zv|0_#w|`a=Wv}sZOw2xT z(vnc1tf?6d@eQT;JVH)Y{CHwiqdS>6GTBU8mp5nxV}_>gwCXakx~Cu40fa z#Q7xczul9&gN)epq$TkC4Mt6geKqFm>Fc_WA8JP_?9y&4>m*m|&#|J2sqFqw^j!z! za?^5#M5P8O*3}aVZ7us#^c(hYi8TxYy%YSmgDm4^;zypV!je-kLo;IN8xQ9{uepiA z+plTcay+g%aeqS*3%k1kLI!JJBanX~faCzajrI3SR5YfQse#}rkhO1A(}97%SDhVS zt5VOI99lW877OJ*@VZ>>`gbi?R>1x@XgLWlG$Vdql5tm_liVDnNv_b!*>yft?fsOS zi2{8MKNxc}*k1Lnrqio^` zr}0da8>*sQ$W<(3OK0hAyIRH@8jH{+Xn$>cf|C>`dwldICpg6NHych%Rjxj)KuU&p z6QQmxZzeCY-vT`R({o_IrtgVSB7_DbE;@Dgkn7)VzgW2P&SjVlrQY|gia}(z+1u2p zn3)+bs+Szcdf9vXCXbSrzukK$0nz%t0=dm`+HCnScZemNZ0<66kGP0nShLNWScdoezbz-L+r=zjMk5qy{iOFQ+SBLy&AeiHAbht~-(lHpJ)-zJ z%)FKF$Nb8Z7QNPv2fbVUWKArNJZk*$KrNbELtZ~C*Ki$O2QMYMmVY9X*HKk3>Dj8g zRvCp&#wn;}U?&~^xM&C_)UyK)SH5o* zx+Hw4D>>qBfZgS5A&&|9G8W+TJmGG^SS~tWNUj>0Ypf7|5>1!As657i;rs0@4AWnw z-abd~YaT;fz8D;8Gzr=QIhsKZ1DcpOI1L1JF^wW^%@o;9P23gY`~>L6h6>Up<6|qb zhJmhqcwVb2Y0nxjU2Rj-Ygv!%hbUgQ&=72lyXf++4&4*wG0;>;gAFVibHgL&c-V9M zf#U-(sOe@@wu0k=2luNI=&{W$c((Dg)bBmjA9Z)G(DIk@f6zy@mm~Tnu5GI4B40Lu zd`im_+nS9V`}ctxTi>oN_M-nzk=6O1b``aPo@>r8D?)yJFX5zu%)l`rJl+ScT^pOW zp-mOe&0u?UVH{oF__w=7O+rEFTHZB9O@Q~&v4(bv%0qrK87v^eh@* z06sXcnwOh7g^y@`5~vUFF2ob%+Wf_MLn@h;jxX1I)ES`L+nk+q#U+P)%Rag`HSwCtuk}%|@@;#M6v{t2U1sW?^f) zA~#rfGq5qDP4uzRL&Z`4TgKfw|3Xf-H)?974q*I{2k%)?AD+LKfv`n9x|iUy?L&-4 z-#QwX=rkrz>4Nx2Ye~PzXAjj&=GlS(Bw&=V*9-48vVR(4u(3i*8~#wX$s1wya7?m? zdg?Ozf3(flovlqAP@Kf}$KrDQsqS~LUbA`hV-eoTGGSlc$5NEnN%iCr{{wU>wyonT zs}f5(Mc#NjXoE%gDh+7CCU}r!^CK#I*o9@JAug47YtL5|T26V_I#oE+48`Ae*M{-D z?G;0J!MqU2O)1p$KE2HQ$jRm-p&=AVFbnw}YXn_kN4MyJNprPL*!4-L>4$~#eQg&@sPO;6ax%dKK750&P}dtD3P>`Mz}J0qM% zw%`XgGyXe-p}NUY*_0`oH$6&9^AKwluFTcET7cSAV)ap`RT;+o)ogTU0 zqcc6q7y^^Y1VS-6SGYT(=o=g)JuACju_^aMVd(Y$#iNkHPAar?LYU2vu(I^2bX`6x z2Q4t_Mby1NzVSDTCR!&;W_f(`A2RN2WDNx{JXQZ*mt%gi+dLZ`>r;EiyWvnhni*i{ zL;fSAELq=SKr0QfTsMd6kCtLTsLy%Mq-!+CO-L;;9ZCdH!Z5r{zH=&*(v2$j9^M$D zExhb1WDuEt6^3rOBhzKi`!a(DZ+8pP;O*{I)o=U9^5K3fiP)x*FEsFt-o%LbE5jqU zo-M>|b%g~RSM#3_ZwY8xd>>BlgdxjO7`J5~@MT@KwBYp3IpF_y{1C^`Ce)P1H+Fa4}U-gmJmt#Z+Xem<{ z4-BqcX+)qd%|Z=^vm}VuP(Ie!NxWtWJVv%YIA}J=^8iD2wr@gPLwU64!oC)TeMhOy zTZKPs*WA`ApWt9wK7A#E)KhET$4pAE$4RfE=`C6?3GDlTt0jyZ-UmcuB4T%o!L+0mxnp-W}NKIO3?T+eKu}23lL{BcRlfO9$lpHfi`gM^D(CY ztddE-Tnnoz4e!^+5nK?1Nc~yn2t;Y_e6~@#)Y@5*&QbXod)*PNx6C1DAegW%m?6w}?db^d!fWZ(3Mw`MZ}iyP&tcelfT zH7YNM7wNVDY3Fb6Sr@yq{&=b1>>3qpB&fR1kzyf=ZC70Wt7OPabS{p3+Cu-umZ}D( zh^v1-l}jlXvuw$zsB}!*0F4Od_jd$fWPg6p7X}-nwe}(m*JJP}=Tl>dUIWh7m>HuS>Orh6k{oXnUW=hRu(22}U z=dS$(1&_3-?#hRFhTwVaqeDx}vntSw;^Ix?nBv*e&H@chIsM)f-a0OXCn%^xSBnxk#Z(b4>_Rbvd{wn->Qg7j+eVMc1`-Z9C+b^fqsH>I0lxw7P(BRX4YK0hE zE^J@Xue0Z}rDu%|0v&PUS%|r&J!_1G8&&SV#H(>R+DfI^Lw)x-=+N9wGm(s;@4irD zS*Y(`=+8AXfaui^ICP-H1IzO5x9!1?NcMSii&tXqLlmCG8*~^)r%tv>9jIrR<=U10 zTbP8|S+sY5Ax>x3I9)a)i$ofFjCL}P?{F}RGEg?^u$e~rQeJmzPEfAV_~-yGF9PHNp9cFs`WtSSzn4l<&4wz z*K5S%B|geAmOl8h)``HCiN>ci)V45rQF-mQK8!J-A%93QR7H8%ge!?%i8 z<(m4ZP`!2JUiV@Bj~AlP+bDf*X~MROm6rF$>)_w<(GK^%wA$zAVL!F9Pi|3<70JqE4zVVX4D&^6+x)(_+ctV7j@$VkRpYgZ zj2Qxqo=`7!yKhG`S9l;8W-kZkEy@eT~fewcyA zWA=B-yw?`89hZh5`W4HqAxl@i1-yHppo~amq)~A2 z*ta}|(nIP<_iMq=O?ae*Q%KrA%a0k=B6#y$PxfCKGIaWGd<$^kIF@if9lvLwCWUt1 zAQDuWT>mO|y!VPcOR{4N&^mU+vp-v#PzbJF*hiVu{Hz7TJ_(p-SDQf*ZE7ezwQqBk z8H$VKbd#z|*X^CvIigxy6#z&OwUuhM^GTc=RxW%>V&mOzRzZ3u_x0W|lfGe@{AOhY zkj*kHrE)nvPn@Tt+9JyfXqjgF2roPGXOU0f=Xwqc4@%_Li`>sE<{SJ7lM|@dhV*?q z%&=njDbzyryK8fnhDb)gFAG23wU0h*n1*ni5d3E2_>hf!F^O7#5Zxfi-#)t-ELLU=K2rk9lvos2 z+-$zqkXvz6nt{;Ia5V0kRK9o>)5OiDAb%A+l2(|Js=?@&pkN|b@`{qb)GhSt zQRh2=9?JFE8L5;ogv;ua%DeKOZI3V7g!hRms^e z&M+&jSE+&abA_*#H3USUP05_0%;?_W!YwA&A$zGJ@p(oG3vr1N^M(6GybhIa>r(Nh z8Byx`51V$kRkq(`$ifHFe#9 z9Q?FWT5g4ztHa)djwV=gblj-qh*U*<&5E>K*6ILl&gL#+4FPE-&xAS(OYm$sMQ!Zy z^_X0j$x$iuE(#dddGot=bDDRNSyb_6$1R|bGnn3;W{?(=U2Y6{z!cWSW))l&!snoP z>)BFs8wwvB1P_IfR#k=-Bz(Q+rn8mI_9l326~e8$uEWN5SA%!QAT=kb zGs2ez;}Nlp(xP#)p(NA}<}SVL>dDKs{-shbY)bNVt(l=VMi9szlwI@Ojs0>UR$)bm z+Uw`pm}Nnu=$eJ(=kS7dCzd($r&5uy-fVn@+7_ShyP7>tAJVHsyle%yT^siW(seHk zKO7tc8}6LO;iH}X`rI!+fr?{#a>K+*pA+x}zlpIO9#Y6<{gc)~XVm4i7Ex4+~w6XELVAquZjko?W} z*qXpfo$vwEK_0qAa!NN{xu@PR!wB;540@Nph;*^XqX$JcoJ>4R6(s#Hx zh+>K>Njh>g)h{*gZK!!`@Xl~oC)xk;bR!MBs?w)oVg_{^`=N?iE?H+`xr^4Ywky2G z4Mv3kT2j)e3C6IydcnF^%F849{*6}!x;PG>9uX4eZ|VJTd&(+sU|&TpIoutSWXJM( zA;&b|JX;+C(`oQzSZRF+eo2?}>yik-FpKcJN@MB_uOV?@`I{7JZ zA6-GDR1UaD1-p}9&qrZ`ADjIy@n}Yc=j>M@4{MB!$4XS27tKV~%uA2|2%|IQCvT>+ zbVBPLC`s6{JXnX6z5;QO>gCLiE?2U@|9Ji`4gPxD@W>q{bcy-X=b=$sF>~uT>W3NA z*6(KGL5ePO`eiBH5A&Hu`j~>Z|Mae_F`G-&zu5WMPXIh6YCYh6MEc8PX}n#3?0fLY zt_=_Z*oRJat6s-;b@dU<4=5%Pv-19~BdYmYPj&O=dmN(+(f&l(IWc#oN;*gXj+Y|3 zzcE?K*cVrEHS8c`Zz<1+qbyaTahc1Ga%;A-GauJG;JV9?hAxF8mN7lT2ok*y0tt9N z71>lW7*R?14CBe~Ap|kTNTh#=K*m}F)Oe5W&oXT7n`^_k8f}^9_wVaQ&g^kdEBJct z3g5pN6OeQz{aV-E`RDGC*8rvU`@KRyY5T9wPDs5tnfbTXkurpTs6_K@k>DCIDK!!&1y}rXjXf5Ve)GNt(aml^;JlK?<*HTW@b($vDi^!{jpO76W$Z)Q$FVI zwwk%{3dM$R!&0@$;WADOaCj;KPN2aJu-^|xkg_{W<=gLvV3234G3%}9<~Rc*S{K%O zOl0{k^cQIn#4vsO94VHHO)7HJHA9Y(0xXxBNPaF*g%kiyCLAmV82cJ|zC?cqHxS~<029^y<%nF#X42l2Ybp|@mtg&6 z$1(990I2hX`Zv1E>cyXvq{BtH>bAhkomivGLxgF^TpXcisVoHRWpv9uhB&-$0$3G5 zWzaj|t8lKyN92+ZYOS&xB;s>6#B5Y_x+m)&gWL6-&dqkkToIKXEv?nJFQe~&F2WC` zd%qL@v_Zhsq~j6ul{oKop#D(E^EGCs`^!nZyy(=Zkb4#97+pi4fbH*VolGe$W+||v zCA7J;tx@-miPFYnOTPAFNK3Bw5Sz0M-(Y(BwqX^8I9XEUjLmfS=;lMUycu)UT@>EJ zI&4vr2s}8k1BbJJSs+7MIJgT3HC{(>P?i?vw-$L7I6Z?Tb;H~A(6+@(nkoF$;%ZoO zEx^sL;}6_QO|0W0e11pUDCB9Fc+Igk6^ZDNz*`jz#;=Cvj|H97Nl?-~ZDh*?3lIcuSOqjz3Or&b*3nwraa2lIWHyD#%PB8jaQdZoR$qvhn#;+GyWk)$v5f zw-aAeyLkh8*4wx*>AWdZlSeeUe?e(tT>h?ConM&!*b|LBwkkgGuh?~EeD*q@ z%lT6Kl_{{q{n^>#sRrXj%Olyp$n74wuy6|1vh8)Cd0p8bd8Sz^5sSnBYUG|-pOchc z<^%2TY;vqjz9Z<85tF=eYvDe56scj{Rzc|V zg&*yOKOuB9k|7aK0D}4_XyD<4kVN$VPV|K0|RW9L|AM zD*LB;wJ||T)=~G(`rFU1(qedN67e>%;^9(Q*)FNPA^D*n<1!klXk*a&)v&A;x$=$Q z^HPD432gr%NEj2}nTWF6T=hwH!F0}{h+++p6z!c2KkJcn{F}pE$vU6|@Wt7nRz7ph z3~bQp;>{V?!W4!=(v^9xh22w?CbBv{9V;7cK@z_ib_}X;2G=_r#q+~lJbd!Ij_!JG zIt5A7_0I~a3XrF)P^)k;iD25cGKp?bZH6Ms+(KUSeC!vIoV5hA znBqxtWsdSa_EZal(lV*B_rX0c^u&sdci&n-tPKgPT)DE3Sp@p|ULZVV;H8CSJ@3vvu z{`A|npRI({B>MbAx{Gz#-8UOwRnd0++OgfS+3h0SlD!r07AmyDGGOF>YQ}MWeilcz z(d`70B=m_QIfSHe%P+mm$xx4K?9p-#*8fGP4eTQ&xQuybnqILCqtlji2D9@#Gm(~& zY5Drkp-=v-PZK<}syGOBKgo-sPP9OH-@9%P>1&w#c%vl}o&GSRXB2o9{f+CQAx;ur zbbKx3McZy}N~qqJboI|6bfJGvd5-xdMt3wX6)mMY?9R!LIee@G5;MqNWKT$j8uQs} z8J7d4y;j^~vd}7F6PtW5hzI+kk6uIFe#F9O%LR4S&Chh9OL46&b~M zxP4gkYVrbesMWnm1F9}>5o4NOBnIk$=b@A z-4j2%B-Vj~37J)BXRQ5RFn#*r_W4QK&K2pO>CR2Xo!BHhkDZjiDDdu!{}F<=8P)-% zGjFsoEuuQhlg;lW+7iR%(H{%*`h(Tdu65?!_zQoS0qtPA6c{eum%c+@D zcmK=~y;yMb-6~K6{HF~7yZT1!N8Q`4X6Ii&(NUB2;~)d)Kp@|%mYY)vf!_kHO1`Jv z;XH0f7HWFx1vAflLDXN+iH)?2xwrC8@+BtP!_enspnv_qqZ&(E3-*o31;ysPSW8MR zY$&^bMp8h!1VKs(=@^i1kj`QBLZrL9r8|a3=`MkxQHF-085m%OcaPV7-_P$j-skZj zz}Yi<@AX~l{G7`eMG~Lonqp*zx&9It^l70#!-wW@yn1_f$-kmKY4EHO@oVVi`xVCA zb`D*GuRAP1Rwg5Q*`E^@eXW%I8v5;}{_fzJ>bf4&XC-3^84|ol(3zaq1{7a``FqJ* z4P%jtz{~U{BO%=|26&j^_yHHe+2fu|Rmyjfd-6xUb8L3BfhMKpJ&hgCxS^3-Sp#ZE zZ?EhMjK0-vv#x&uw^%Hk@7Di)#srxUW~sZAjkdbxUGhts8Hw($T+Qhm?t5;)*N|Dc zEqNfR$*5~*f%fY#)h!DFkKO5k)`b^x-b}>nm8qZZCaxU5F;JJZ+@~M_56v2GDnwyr z93X;wck7GFIAzph>NRs~1V4Y=t33V8$VzN_AoQz%R2nV1y;heo?`9D4{P)G;2Ob+^ z?t?P)iGOQw@Nq;S>gV_Jrxy6{<>!_+)%HVPrpBkp zf%T>vxILm{4*@w;p}-!`KNvG){6w)m)31!%U3HMk7h6K3XcGr-P0mag#5MK@?Od{a zrDhb8c_c8MH?I>iFRru6C=HFf_4D*fDgIB$BUQ-5VCx?zKoa`+`Jg?`7=^n8-P}JP zwnrPJIz-%$p#2DulDsQvVym-*Ff?22KXuhhv%3*|`>>p;S^Vt=MfNcCn2oQxrB2J) zVyjyU)fJOEZ?V+rrdo}OkADMfVGTIscW_RSQ(=F|{_h_A@IQ<+{q6t+7XoMn{94bSQczIk@N$mX!)IR2v{c5IfktMco~IhP%c}5I13Gjoqtdm@w>s(bKn8fw`{g}4Ve20 z5+2YCaa>zJ4w_h6a^UVokU|2FUOxgRNDR>k lBC6^^jDt9!yto$CH)Y3Q&?&_Nz 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 T+*6wR1*F&0)z4*}Q$iB}`aY30 literal 0 HcmV?d00001 diff --git a/2025/docs/ko/assets/Top10Mapping-ko.xlsx b/2025/docs/ko/assets/Top10Mapping-ko.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9829b1d26fdf6cde6b720017f17e6dfa69a5bcaa GIT binary patch literal 10376 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 literal 0 HcmV?d00001 From 5cefeb2b5d6454b10fdb64b5df31cc8d556bc8ca Mon Sep 17 00:00:00 2001 From: ni5am Date: Tue, 6 Jan 2026 21:25:23 +0900 Subject: [PATCH 112/167] Update Top10Mapping image and Korean translations --- 2025/docs/ko/0x00_2025-Introduction.md | 2 +- 2025/docs/ko/assets/Top10Mapping-ko.PNG | Bin 91572 -> 83861 bytes 2025/docs/ko/assets/Top10Mapping-ko.xlsx | Bin 10376 -> 11921 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index d776429e0..0b5161dde 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -28,7 +28,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! 2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. -![Mapping](../assets/2025-mappings.png) +![Mapping](./assets/Top10Mapping-ko.PNG) * **[A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. * **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. diff --git a/2025/docs/ko/assets/Top10Mapping-ko.PNG b/2025/docs/ko/assets/Top10Mapping-ko.PNG index f8a7ab8f036897ec0145e8d2c716db3efc613abb..32af569e84ad6e21815f2a7f7116c5431644057f 100644 GIT binary patch literal 83861 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 literal 91572 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 lBC6^^jDt9!yto$CH)Y3Q&?&_Nz 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 T+*6wR1*F&0)z4*}Q$iB}`aY30 diff --git a/2025/docs/ko/assets/Top10Mapping-ko.xlsx b/2025/docs/ko/assets/Top10Mapping-ko.xlsx index 9829b1d26fdf6cde6b720017f17e6dfa69a5bcaa..f4c5acf338cf7a8e3269416e5201648a22b7f3f7 100644 GIT binary patch literal 11921 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%0D=iuz~dP}+UmZ#r66-MaF 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 From a3a6a85e71516bc01deb61bef02ba40dbfa97e65 Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Tue, 6 Jan 2026 22:40:56 +0900 Subject: [PATCH 113/167] reflect reviews --- .../ko/A04_2025-Cryptographic_Failures.md | 77 +++++++++---------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index a888a3864..197226585 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -1,11 +1,10 @@ -# A04:2025 암호 체계 실패 ![icon](../assets/TOP_10_Icons_Final_Crypto_Failures.png){: style="height:80px;width:80px" align="right"} +# A04:2025 암호 실패 ![icon](../assets/TOP_10_Icons_Final_Crypto_Failures.png){: style="height:80px;width:80px" align="right"} ## 배경. -암호 체계 실패 카테고리는 이전 버전에서 2단계 하락해 4위가 되었다. 이번 카테고리는 암호화 부재, 불충분하게 강한 암호화, 약한 암호화키 그리고 에러와 관련된 실패에 중점을 둔다. 해당 카테고리에 포함된 가장 흔하게 발생되는 3개의 CWE는 약한 의사 난수 생성기(PRNG)와 관련되어 있다. *CWE-327: 위험하거나 취약한 암호화 알고리즘 사용*, *CWE-331: 불충분한 엔트로피*, *CWE-1241: 난수 생성기 내 예측 가능한 알고리즘 사용*, *CWE-338: 암호학적 약한 의사난수 생성기(PRNG) 사용* - +암호 실패 카테고리는 이전 버전에서 2단계 하락해 4위가 되었다. 이 카테고리는 암호 부재, 불충분한 암호 강도, 암호키 유출 및 관련 오류에 중점을 둔다. 이 위험에서 가장 흔한 CWE 3개는 약한 의사 난수 생성기(PRNG) 사용과 관련이 있다: _CWE-327: 취약하거나 위험한 암호 알고리즘 사용_, _CWE-331: 불충분한 엔트로피_, _CWE-1241: 난수 생성기 내 예측 가능한 알고리즘 사용_, _CWE-338: 암호학적으로 약한 의사 난수 생성기(PRNG) 사용_. ## 점수표. @@ -58,24 +57,23 @@ ## 설명. -흔히 말하기를, [전송 계층]((https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 내 모든 데이터는 암호화되어 전송되어야 한다고 한다. 이전 장벽으로 CPU 성능 문제, 프라이빗 키/인증서 관리 문제가 있었으나, 지금은 암호화 가속을 위한 CPU 전용 명령어(예: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 로 문제 해결되었으며, 프라이빗 키와 인증서 관리는 [LetsEncrypt.org](https://LetsEncrypt.org) 같은 서비스나 대형 클라우드 공급업체가 특정 플랫폼을 위한 통합된 인증서 관리 서비스를 제공하여 관리하기 쉬워졌다. - -전송 계층 보안 외에도 어떤 데이터가 암호화 필요한지와 전송 중 ([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer) 내, OSI 7계층)에도 추가적인 암호화가 필요한지 결정하는 것도 중요하다. 예시로, 패스워드, 신용 카드 번호, 건강 정보, 개인 정보 그리고 비즈니스 기밀 자료는 추가적 보호가 요구된다. 특히 해당 데이터가 개인정보 법률 (예: GDPR, PCI DSS)에 적용 대상인 경우 더욱 그렇다. -해당 데이터들을 위해선 다음과 같은 사항들을 검토하여야 한다. +일반적으로, [전송 계층]((https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 에서의 모든 데이터는 암호화되어 전송해야 한다. 과거에는 CPU 성능과 프라이빗 키/인증서 관리가 장벽이었다. 현재는 암호 연산 가속을 위한 CPU 전용 명령어(예: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 가 도입되었고, [LetsEncrypt.org](https://letsencrypt.org/) 같은 서비스와 대형 클라우드 공급업체가 자사 플랫폼에 긴밀히 통합된 인증서 관리 서비스를 제공하면서 프라이빗 키와 인증서 관리도 간소화되었다. +전송 계층 보안 외에도 어떤 데이터가 저장 시 암호화가 필요한지, 그리고 전송 중([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer), OSI 7계층)에 추가적인 암호화가 필요한지 결정하는 것이 중요하다. 예를 들어 패스워드, 신용카드 번호, 건강 기록, 개인 정보, 비즈니스 기밀은 추가 보호가 필요하다. 특히 해당 데이터가 개인정보 보호법(예: EU의 GDPR)이나 규정(예: PCI-DSS]의 적용을 받는 경우 더욱 중요하다. +이러한 모든 데이터에 대해 다음을 확인해야 한다. -* 약하거나 오래된 암호화 알고리즘, 프로토콜이 기본 값으로 사용되거나 예전 코드에서 사용되고 있는가? -* 기본값으로 설정된 암호키가 사용되는가, 약한 암호키가 생성되었는가, 같은 키가 반복적으로 사용되는가, 적절한 키 관리 시스템이나 키 변경 주기가 없지는 않은가? -* 사용되는 암호키가 소스코드 저장소 내 존재하는가? -* 암호화가 강제되는가? (예: HTTP 헤더 보안 지시문 또는 헤더 존재 여부) -* 수신한 서버 인증서와 신뢰 체인이 적절히 검증되었는가? -* 초기 벡터가 무시되거나, 재사용되거나 또는 운영 암호화 모드를 위한 충분한 초기 벡터가 생성되었는가? ECB 같은 안전하지 않은 운영 모드를 사용하는가? 인증된 암호화 알고리즘이 더 적절한 상황에서 단순한 암호화 알고리즘을 사용하지는 않는가? -* 패스워드 기반 키 유도 함수가 없는 상태에서 패스워드가 암호키로써 사용되는가? -* 암호화 요구사항에 충족하지 않는 난수를 사용하는가? 만약 올바른 함수를 선택하더라도 개발자가 시드를 선택해야 하는가? 만일 아니라면, 개발자가 충분한 엔트로피/예측 불가능성이 부족한 시드로 강한 시드 기능을 덮어쓰지는 않았는가? -* MD5, SHA1 같은 더 이상 사용하지 않는 해시 함수를 사용하고 있거나 또는 암호학적 해시 함수가 필요할 때 비암호학적 해시 함수를 사용하는가? -* 암호화 오류 메시지나 사이드 채널 정보가 패딩 오라클 공격 등으로 악용될 수 있는가? -* 암호화 알고리즘이 다운 그레이드 되거나 우회 가능한가? +* 약하거나 오래된 암호 알고리즘 또는 프로토콜이 기본값으로 사용되거나 레거시 코드에서 사용되고 있는가? +* 기본 암호키가 사용되는가? 약한 암호키가 생성되는가? 키가 재사용되는가? 적절한 키 관리 및 키 순환 주기가 없는가? +* 사용되는 암호키가 소스코드 저장소에 커밋되어 있는가? +* 암호화가 강제되지 않는가? (예: HTTP 헤더[브라우저]의 보안 지시문이 누락되어 있는가?) +* 수신한 서버 인증서와 신뢰 체인이 적절히 검증되는가? +* 초기화 벡터(IV)가 무시되거나, 재사용되거나, 암호 운영 모드에 맞게 충분히 안전하게 생성되지 않는가? ECB 같은 안전하지 않은 운영 모드를 사용하는가? 인증 암호화(Authenticated Encryption)가 더 적절한 상황에서 기본 암호화를 사용하는가? +* 패스워드 기반 키 파생 함수 없이 패스워드를 암호키로 직접 사용하는가? +* 암호 요구사항을 충족하도록 설계되지 않은 난수를 사용하는가? 올바른 함수를 선택하더라도 개발자가 시드를 지정해야 하는가? 그렇지 않다면, 내장된 강력한 시드 기능을 엔트로피(무작위성)가 부족한 시드로 덮어쓰지 않았는가? +* MD5, SHA1 같은 더 이상 사용하지 않는 해시 함수를 사용하는가? 암호학적 해시 함수가 필요한 곳에 비암호학적 해시 함수를 사용하는가? +* 암호 오류 메시지나 사이드 채널 정보가 패딩 오라클 공격 등으로 악용될 수 있는가? +* 암호 알고리즘이 다운그레이드되거나 우회될 수 있는가? 레퍼런스 참고 ASVS: Cryptography (V11), Secure Communication (V12) and Data Protection (V14). @@ -86,39 +84,36 @@ -* 애플리케이션에 의해 진행, 저장, 전송되는 데이터를 분류, 라벨링한다. 개인정보 보호법, 규제 요구사항, 비즈니스 필요에 따른 어떤 데이터가 민감한지 식별한다. -* 하드웨어 또는 클라우드 기반 HSM(하드웨어 보안 모듈)에 민감한 키를 보관한다. -* 언제나 사용 가능한 신뢰할 수 있는 암호화 알고리즘을 이용한다. -* 불필요한 민감 데이터는 저장하지 않는다. 저장할 시 가능한 빠르게 지우거나 PCI DSS 준수 토큰화(PCI DSS compliant tokenization) 이용 또는 마스킹 처리를 한다. 데이터가 보관되지 않으면 훔쳐질 수 없다. -* 모든 민감 데이터 암호화 되었는지 확인하라. -* 강한 표준 알고리즘, 프로토콜, 키가 최신 인지 확인하고 적절한 키 관리 시스템을 이용해라. -* 모든 데이터는 전달 시 전방향 보안(Forward secrecy), 암호 블록 체인(Cipher block chaining)에 대한 지원을 중단하고, 퀀텀 키 변경 알고리즘을 지원하는 TLS 1.2 버전 이상에서 암호화 되어야 한다. HTTP 스트릭 전송 보안(HTTP Strict Transport Security, HSTS) 을 이용해 HTTPS 강제 암호화를 하여야 한다. 모든 것을 도구를 이용해 검사하라. -* 민감 데이터가 들어있는 응답 값 캐싱을 비활성화한다. 이는 콘텐츠 전송 네트워크(CDN), 웹 서버 내 캐싱과 모든 애플리케이션 캐싱을 포함한다. (예시. 레디스(Redis)) -* 매번의 데이터 분류 시 요구되는 보안 통제를 적용하라. -* FTP 나 STARTTLS 같은 암호화되지 않는 프로토콜을 사용하지 마라. 기밀 정보 전달에 메일(SMTP) 사용을 피해라. -* 아라곤2(Argon2), 예스크립트(yescrypt, 스크립트(scrypt) 또는 PBKDF2-HMAC-SHA-512 같은 작업 인자(지연 인자라고도 함)과 강한 적응력(Adaptive)이 강구된 솔트 해싱 함수를 사용하라. 레거시 시스템을 위해 비크립트(bcrypt) 이용 시 [OWASP Cheat Sheet: Password Storage](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html) 을 참고하라. - \* 적응력: 시간이 갈 수록 레인보우 테이블 생성에 많은 리소스가 사용되게 하는 능력 - \* 작업 인자: 계산 횟수를 증가시키는 것과 같이 해시 과정을 복잡하게 만드는 인자 -* 초기화 벡터(IV)는 운영 모드에 따라 적절하게 선택되어야 하며, 이는 암호화적 보안 의사난수 생성기(cryptographically secure pseudo random number generator, CSPRNG) 사용을 의미할 수 있다. 넌스를 요구하는 모드인 경우 CSPRNG를 이용해 초기화 벡터 생성할 필요는 없다. 다만, 초기화 벡터 사용 시 고정키에 두 번 이상 사용되지 않아야 한다. -* 단순 암호화 알고리즘보단 인증된 암호화 알고리즘을 사용해라. -* 키는 암호학적으로 랜덤하게 생성되며, 메모리 내 바이트 배열로써 저장되어야 한다. 만약 패스워드가 사용 중이라면, 이는 적절한 패스워드 기반 키 유도 함수를 통한 키로 변환된 상태여야 한다. -* 적절한 곳에서 암호학적 무작위성이 사용되는지와 낮은 엔트로피나 예측 가능한 시드가 사용되지 않는지 확인해라. 대다수의 현대 API는 개발자에게 CSPRNG에 보안을 설정할 것을 요구하지 않는다. -* MD5, SHA1, CBC 운영 모드, PKCS number 1 v1.5. 같은 사용되지 않는 암호학 함수, 블록 빌딩 메소드와 패딩 스키마 사용을 피해라. -* 리뷰, 보안 전문가, 사용할 도구의 목적사항을 통해 설정 값이 보안 요구사항에 맞는지 확인해라. -* 양자 컴퓨터 이후의 암호학(PQC)을 준비해야 하며, 고위험 시스템은 2030년 전까지 반드시 안전하게 보호되도록 하여야 한다.(ENISA 참고) +* 애플리케이션이 처리, 저장, 전송하는 데이터를 분류하고 라벨링한다. 개인정보 보호법, 규제 요구사항, 비즈니스 필요에 따라 어떤 데이터가 민감한지 식별한다. +* 가장 민감한 키는 하드웨어 또는 클라우드 기반 HSM(하드웨어 보안 모듈)에 보관한다. +* 암호 알고리즘은 가능하면 신뢰할 수 있는 구현체(라이브러리)를 사용한다. +* 불필요한 민감 데이터는 저장하지 않는다. 저장할 시 가능한 한 빨리 폐기하거나 PCI DSS 준수 토큰화(PCI DSS compliant tokenization) 또는 마스킹(truncation)을 적용한다. 저장하지 않은 데이터는 탈취될 수 없다. +* 저장된 모든 민감 데이터 암호화되었는지 확인한다. +* 최신의 강력한 표준 알고리즘, 프로토콜, 키가 적용되어 있는지 확인하고, 적절한 키 관리를 수행한다. +* 전송 중인 모든 데이터는 TLS 1.2 이상의 프로토콜로만 암호화하고, 전방향 비밀성(Forward Secrecy) 암호를 사용하며, CBC(Cipher Block Chaining) 암호에 대한 지원을 중단하고, 양자 키 교환 알고리즘을 지원한다. HTTPS는 HSTS(HTTP Strict Transport Security)를 사용해 강제한다. 도구를 활용해 모든 항목을 검사한다. +* 민감 데이터가 포함된 응답의 캐싱을 비활성화한다. 이는 콘텐츠 전송 네트워크(CDN), 웹 서버, 모든 애플리케이션 캐싱(예: Redis)을 포함한다. +* 데이터 분류에 따라 필요한 보안 통제를 적용한다. +* FTP 나 STARTTLS 같은 암호화되지 않는 프로토콜을 사용하지 않는다. SMTP로 기밀 정보를 전송하는 것은 피한다. +* 패스워드는 작업 인자(delay factor)를 갖춘 강력한 적응형 솔트 해싱 함수를 사용해 저장한다. Argon2, yescrypt, scrypt, PBKDF2-HMAC-SHA-512 등이 있다. 레거시 시스템에서 bcrypt를 사용하는 경우 [OWASP Cheat Sheet: Password Storage](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)를 참고한다. +* 초기화 벡터(IV)는 운영 모드에 적합하게 선택해야 한다. 이는 CSPRNG(Cryptographically Secure Pseudo Random Number Generator) 사용을 의미할 수 있다. 논스(nonce)를 요구하는 모드의 경우 IV에 CSPRNG가 필요하지 않다. 모든 경우에 IV는 고정 키에 대해 두 번 사용해서는 안 된다. +* 기본 암호화 대신 항상 인증 암호화(Authenticated Encryption)를 사용한다. +* 키는 암호학적으로 무작위로 생성하고, 메모리에 바이트 배열로 저장해야 한다. 패스워드를 암호키로 사용하는 경우 적절한 패스워드 기반 키 파생 함수(PBKDF)를 통해 키로 변환해야 한다. +* 적절한 곳에서 암호학적 무작위성이 사용되는지, 그리고 예측 가능하거나 엔트로피가 낮은 방식으로 시드되지 않았는지 확인한다. 대부분의 최신 API는 보안을 위해 개발자가 CSPRNG에 시드를 설정할 필요가 없다. +* MD5, SHA1, CBC(Cipher Block Chaining), PKCS [#1](https://github.com/owasp-kr/Top10/pull/1) v1.5 등 더 이상 사용되지 않는 암호 함수, 블록 빌딩 메서드, 패딩 스키마 사용을 피한다. +* 보안 전문가, 전용 도구, 또는 둘 다를 활용해 설정과 구성이 보안 요구사항을 충족하는지 검토한다. +* 지금부터 양자 내성 암호(PQC)를 준비해야 한다(ENISA 참고). 고위험 시스템은 늦어도 2030년 말까지 안전하게 보호되도록 해야 한다. ## 공격 시나리오 예시. -**시나리오 1**: A 사이트는 모든 페이지에 TLS 강제를 사용하지 않거나 약한 암호화 알고리즘을 지원한다. 공격자는 네트워크 트래픽을 모니터링하여(예: 안전하지 않은 무선 환경) 가로챈 요청에서 HTTPS에서 HTTP로 다운그레이드 한 뒤 사용자의 세션 쿠키를 가로챌 수 있다. 공격자는 세션 쿠키를 재전송해 사용자 세션을 하이재킹하여 사용자 개인 정보 접근 또는 변조가 가능하다. 위 내용 말고도 공격자는 전송되는 모든 데이터 변조가 가능하다. (예: 송금 수신자) +**시나리오 1:** A 사이트가 모든 페이지에 TLS를 사용하지 않거나 강제하지 않고, 약한 암호화를 지원한다. 공격자는 네트워크 트래픽을 모니터링하고(예: 안전하지 않은 무선 네트워크), HTTPS 연결을 HTTP로 다운그레이드한 뒤, 요청을 가로채 사용자의 세션 쿠키를 탈취한다. 공격자는 이 쿠키를 재전송해 사용자의 인증된 세션을 하이재킹하여 개인 데이터에 접근하거나 수정한다. 위 방법 외에도 전송되는 모든 데이터를 변조할 수 있다(예: 송금 수신자). -**시나리오 2**: 데이터베이스 내 패스워드는 솔트가 포함되지 않는 단순 해시로 모든 사용자의 패스워드를 저장한다. 파일 업로드 취약점으로 사용자 패스워드 해시값 탈취가 가능하고, 솔트가 포함되지 않는 해시는 사전 계산된 레인보우 테이블로 매핑하여 원본 패스워드 탈취가 가능하다. 솔트가 포함된 패스워드라도 단순하고 빠른 해시 함수로 생성한 해시는 GPU로 크랙 가능하다. +**시나리오 2:** 패스워드 데이터베이스가 솔트 없이 또는 단순한 해시로 모든 사용자의 패스워드를 저장한다. 파일 업로드 취약점으로 공격자가 패스워드 데이터베이스를 탈취할 수 있다. 솔트가 없는 해시는 사전 계산된 레인보우 테이블로 노출될 수 있다. 단순하거나 빠른 해시 함수로 생성된 해시는 솔트가 있더라도 GPU로 크랙할 수 있다. ## 참조. - * [OWASP Proactive Controls: C2: Use Cryptography to Protect Data ](https://top10proactive.owasp.org/archive/2024/the-top-10/c2-crypto/) * [OWASP Application Security Verification Standard (ASVS): ](https://owasp.org/www-project-application-security-verification-standard) [V11,](https://github.com/OWASP/ASVS/blob/v5.0.0/5.0/en/0x20-V11-Cryptography.md) [12, ](https://github.com/OWASP/ASVS/blob/v5.0.0/5.0/en/0x21-V12-Secure-Communication.md) [14](https://github.com/OWASP/ASVS/blob/v5.0.0/5.0/en/0x23-V14-Data-Protection.md) * [OWASP Cheat Sheet: Transport Layer Protection](https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html) From 47a7a17a7dbca609637f05df47a32aa6aa3806a2 Mon Sep 17 00:00:00 2001 From: ni5am Date: Wed, 7 Jan 2026 01:07:18 +0900 Subject: [PATCH 114/167] Remove sharps --- .../ko/A08_2025-Software_or_Data_Integrity_Failures.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index da4b22676..2735cf136 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -70,13 +70,13 @@ ## 공격 시나리오 예시. -**시나리오 #1 신뢰할 수 없는 외부 웹 기능 연동:** 한 회사가 고객 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 고객 지원 제공업체로 전송된다. 고객 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. +**시나리오 1 신뢰할 수 없는 외부 웹 기능 연동:** 한 회사가 고객 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 고객 지원 제공업체로 전송된다. 고객 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. -**시나리오 #2 서명 없이 업데이트:** 많은 가정용 라우터, 셋톱박스, 장치 펌웨어 등은 업데이트를 위해 서명된 펌웨어를 사용하지 않는다. 서명되지 않은 펌웨어는 공격자에게 점점 더 매력적인 표적이 되고 있으며, 앞으로도 악화될 것으로 예상된다. 이는 대개 향후 버전에서 수정한 뒤 이전 버전이 자연스럽게 사라질 때까지 기다려야 수밖에 없는 경우가 많다는 점에서 큰 우려 사항이다. +**시나리오 2 서명 없이 업데이트:** 많은 가정용 라우터, 셋톱박스, 장치 펌웨어 등은 업데이트를 위해 서명된 펌웨어를 사용하지 않는다. 서명되지 않은 펌웨어는 공격자에게 점점 더 매력적인 표적이 되고 있으며, 앞으로도 악화될 것으로 예상된다. 이는 대개 향후 버전에서 수정한 뒤 이전 버전이 자연스럽게 사라질 때까지 기다려야 수밖에 없는 경우가 많다는 점에서 큰 우려 사항이다. -**시나리오 #3 신뢰할 수 없는 출처의 패키지 사용:** 한 개발자가 찾고 있는 패키지의 최신 버전을 구하기 어렵자, 일반적으로 사용하는 신뢰할 수 있는 패키지 관리자가 아니라 온라인 웹사이트에서 패키지를 다운로드한다. 해당 패키지는 서명되어 있지 않으므로 무결성을 보장할 방법이 없다. 해당 패키지에는 악의적인 코드가 포함되어 있다. +**시나리오 3 신뢰할 수 없는 출처의 패키지 사용:** 한 개발자가 찾고 있는 패키지의 최신 버전을 구하기 어렵자, 일반적으로 사용하는 신뢰할 수 있는 패키지 관리자가 아니라 온라인 웹사이트에서 패키지를 다운로드한다. 해당 패키지는 서명되어 있지 않으므로 무결성을 보장할 방법이 없다. 해당 패키지에는 악의적인 코드가 포함되어 있다. -**시나리오 #4 불안전한 역직렬화:** 한 React 애플리케이션이 여러 Spring Boot 마이크로서비스를 호출한다. 함수형 프로그래밍을 지향하던 이들은 코드의 불변성을 보장하려고 했다. 그들이 선택한 해결책은 사용자 상태를 직렬화하여 각 요청마다 이를 주고받는 것이었다. 공격자는 (base64로 인코딩된) "rO0" 자바 객체 시그니처를 발견하고, [Java Deserialization Scanner](https://github.com/federicodotta/Java-Deserialization-Scanner)를 사용해 애플리케이션 서버에서 원격 코드 실행(RCE)을 획득한다. +**시나리오 4 불안전한 역직렬화:** 한 React 애플리케이션이 여러 Spring Boot 마이크로서비스를 호출한다. 함수형 프로그래밍을 지향하던 이들은 코드의 불변성을 보장하려고 했다. 그들이 선택한 해결책은 사용자 상태를 직렬화하여 각 요청마다 이를 주고받는 것이었다. 공격자는 (base64로 인코딩된) "rO0" 자바 객체 시그니처를 발견하고, [Java Deserialization Scanner](https://github.com/federicodotta/Java-Deserialization-Scanner)를 사용해 애플리케이션 서버에서 원격 코드 실행(RCE)을 획득한다. ## 참조. From 7c4ce344ffc69288db7f72527960d4851e8ebdc3 Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Wed, 7 Jan 2026 21:00:37 +0900 Subject: [PATCH 115/167] Modify 0x01_2025-About_OWASP.md typos (#28) --- 2025/docs/ko/0x01_2025-About_OWASP.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index 3e28245a4..518033bb2 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -6,7 +6,7 @@ OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있 - 애플리케이션 보안 도구 및 표준 - 최첨단 연구 -- 표준 보안통제 항목 및 라이브러리 +- 표준 보안 통제 항목 및 라이브러리 - 애플리케이션 보안 테스팅, 시큐어 코딩, 코드 보안 리뷰에 관한 서적 - 프레젠테이션 및 [동영상](https://www.youtube.com/user/OWASPGLOBAL) - 다양한 주제의 보안 [치트 시트](https://cheatsheetseries.owasp.org/) @@ -18,7 +18,7 @@ OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있 OWASP의 모든 도구, 문서, 동영상, 프레젠테이션을 애플리케이션 보안 개선에 관심이 있는 누구나 자유롭게 이용하고 공유할 수 있도록 공개하고 있다. 각 지역 챕터의 생성 및 참여도 자유롭게 가능하다. -OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역을 개선 하는 게 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. +OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역을 개선하는 게 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. OWASP는 일반적인 조직과는 다른 성격을 지닌다. 상업적 이해관계에서 자유롭기 때문에 편향되지 않으며 실용적이며 비용 효율적인 애플리케이션 보안 정보를 제공할 수 있다. From 1fb704f965b91ba881c2fb3d2849d1ff8563dbad Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Wed, 7 Jan 2026 21:01:29 +0900 Subject: [PATCH 116/167] Modify 0x02_2025-What_are_Application_Security_Risks.md typos (#29) --- .../ko/0x02_2025-What_are_Application_Security_Risks.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index aeda41cec..04b765e21 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -10,14 +10,12 @@ 공격 벡터 -

악용 가능성 보안 통제 미비 가능성 -

기술적 영향 @@ -51,7 +49,7 @@ 본 위험 등급은 악용 가능성, 취약점에서 보안 통제가 누락되어 있을 평균 가능성, 그리고 기술적 영향을 공통 평가 요소로 산정에 반영하였다. -조직은 각기 고유하며, 해당 조직을 대상으로 하는 위협 행위자, 그들의 목표, 그리고 침해 발생 시 영향도 또한 고유하다. 공익 단체가 대외 정보 제공을 위해 콘텐츠 관리 시스템(Contents Management System, CMS)을 사용하는 경우와, 의료 시스템에서 동일한 CMS를 민감한 의료 정보에 사용하는 경우를 비교하면, 같은 소프트웨어라 하더라도 위협 행위자와 비즈니스 영향은 크게 달라질 수 있다. 애플리케이션의 노출 수준, 상황별 위협 행위자(비즈니스 및 지역에 따른 표적 공격과 비표적 공격), 그리고 개별 비즈니스 영향을 바탕으로 조직의 위험을 이해하는 것이 중요하다. +조직은 각기 고유하며, 해당 조직을 대상으로 하는 위협 행위자, 그들의 목표, 그리고 침해 발생 시 영향도 또한 고유하다. 공익 단체가 대외 정보 제공을 위해 콘텐츠 관리 시스템(Content Management System, CMS)을 사용하는 경우와, 의료 시스템에서 동일한 CMS를 민감한 의료 정보에 사용하는 경우를 비교하면, 같은 소프트웨어라 하더라도 위협 행위자와 비즈니스 영향은 크게 달라질 수 있다. 애플리케이션의 노출 수준, 상황별 위협 행위자(비즈니스 및 지역에 따른 표적 공격과 비표적 공격), 그리고 개별 비즈니스 영향을 바탕으로 조직의 위험을 이해하는 것이 중요하다. ## 카테고리를 선택하고 순위를 매기기 위해 데이터가 사용되는 방식 @@ -79,7 +77,7 @@ Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 이는 완벽한 체계는 아니지만, 위험 카테고리의 순위를 매기는 데 유용하다. -추가로 커지고 있는 과제 중 하나는 "애플리케이션"의 정의이다. 업계가 마이크로서비스와 같이 전통적인 애플리케이션보다 더 작은 구성요소로 이루어진 아키텍처로 전환함에 따라, 산정이 더 어려워지고 있다. 예를 들어 조직이 코드 리포지토리를 테스트하는 경우, 무엇을 애플리케이션으로 간주해야 하는가? CVSSv4의 확산과 마찬가지로, Top 10의 다음 판에서는 끊임없이 변화하는 산업 환경을 반영하기 위해 분석과 점수 산정을 조정해야 할 수 있다. +추가로 커지고 있는 과제 중 하나는 "애플리케이션"의 정의이다. 업계가 마이크로서비스와 같이 전통적인 애플리케이션보다 더 작은 구성 요소로 이루어진 아키텍처로 전환함에 따라, 산정이 더 어려워지고 있다. 예를 들어 조직이 코드 리포지토리를 테스트하는 경우, 무엇을 애플리케이션으로 간주해야 하는가? CVSSv4의 확산과 마찬가지로, Top 10의 다음 판에서는 끊임없이 변화하는 산업 환경을 반영하기 위해 분석과 점수 산정을 조정해야 할 수 있다. ## 데이터 요소 From d621db89898f1e3e15c17ca0708916218a3febf1 Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Wed, 7 Jan 2026 21:02:11 +0900 Subject: [PATCH 117/167] Modify 0x03_2025-Establishing_a_Modern_Application_Security_Program.md typos (#30) --- ...g_a_Modern_Application_Security_Program.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 86d044fb9..865cd56ec 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -68,7 +68,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 비즈니스 부서와 함께 애플리케이션의 비즈니스 요구사항을 수집하고 조율한다. 이 요구사항은 모든 데이터 자산에 대한 기밀성, 인증성, 무결성, 가용성 관점의 보호 요구사항과, 기대되는 비즈니스 로직이 포함된다. -* 기능/비기능적 보안 요구사항을 포함하여 기술 요구사항을 취합한다. OWASP는 애플리케이션의 보안 요구사항을 설정하기 위한 가이드로 [OWASP 애플리케이션 보안 검증 표준(Application Security Verification Standard, ASVS)](https://owasp.org/www-project-application-security-verification-standard/)를 활용을 권고한다. +* 기능/비기능적 보안 요구사항을 포함하여 기술 요구사항을 취합한다. OWASP는 애플리케이션의 보안 요구사항을 설정하기 위한 가이드로 [OWASP 애플리케이션 보안 검증 표준(Application Security Verification Standard, ASVS)](https://owasp.org/www-project-application-security-verification-standard/) 활용을 권고한다. * 보안 활동을 포함하여 설계, 구축, 테스트, 운영의 모든 측면을 포괄하는 예산을 계획하고 조율한다. @@ -84,7 +84,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 설계, 보안, 서비스 수준 계약(SLA)을 포함하여 모든 기술 요구사항을 협의한다. -* [OWASP 보안 소프트웨어 계약 부록](https://owasp.org/www-community/OWASP_Secure_Software_Contract_Annex)와 같은 템플릿 및 체크리스트를 적용한다. +* [OWASP 보안 소프트웨어 계약 부록](https://owasp.org/www-community/OWASP_Secure_Software_Contract_Annex)과 같은 템플릿 및 체크리스트를 적용한다.
**참고:** *해당 문서는 미국 계약법을 전제로 하므로, 해당 문서를 사용하기 전에 자격을 갖춘 법률 전문가의 자문을 구한다.* @@ -111,7 +111,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 소프트웨어 개발자에게 시큐어 코딩 교육을 제공하고, 보다 견고하고 안전한 애플리케이션을 만들도록 지원하는 데 도움이 된다고 판단되는 기타 교육도 제공한다. -* 코드 리뷰를 수행한다. [OWASP 치트 시트: 시큐어 코드 리뷰](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html)을 참고한다. +* 코드 리뷰를 수행한다. [OWASP 치트 시트: 시큐어 코드 리뷰](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html)를 참고한다. * 개발자에게 보안 도구를 제공하고 사용 방법을 교육한다. 특히 정적 분석, 소프트웨어 구성 분석(software composition analysis, SCA), 시크릿 및 [코드형 인프라(Infrastructure-as-Code, IaC)](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) 스캐너 도구를 포함한다. @@ -142,20 +142,20 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 ### 배포 -* 애플리케이션을 운영환경에 배포하고, 필요 시 기존 시스템에서 신규 시스템으로 마이그레이션을 수행한다. +* 애플리케이션을 운영 환경에 배포하고, 필요 시 기존 시스템에서 신규 시스템으로 마이그레이션을 수행한다. * 구성 관리 데이터베이스와 보안 아키텍처를 포함한 모든 문서를 최종 확정한다. ### 운영 및 변경 관리 -* 운영시 애플리케이션의 보안 관리를 위한 가이드라인(예: 패치 관리)이 포함되어야 한다. +* 운영 시 애플리케이션의 보안 관리를 위한 가이드라인(예: 패치 관리)이 포함되어야 한다. * 사용자의 보안 인식을 제고하고, 사용성과 보안성 간의 상충을 관리한다. -* 변경을 계획하고 관리한다. 예를 들어 애플리케이션의 신규 버전 또는 OS, 미들웨어, 라이브러리와 같은 기타 구성요소로의 버전 업데이트를 포함한다. +* 변경을 계획하고 관리한다. 예를 들어 애플리케이션의 신규 버전 또는 OS, 미들웨어, 라이브러리와 같은 기타 구성 요소로의 버전 업데이트를 포함한다. -* 모든 애플리케이션이 인벤토리에 등록되어 있으며, 모든 중요 세부사항이 문서화되어 있음을 보장한다. 구성 관리 데이터베이스 및 보안 아키텍처, 통제항목, 대응방안, 런북(runbook) 또는 프로젝트 문서를 포함한 모든 문서를 최신 상태로 유지한다. +* 모든 애플리케이션이 인벤토리에 등록되어 있으며, 모든 중요 세부 사항이 문서화되어 있음을 보장한다. 구성 관리 데이터베이스 및 보안 아키텍처, 통제 항목, 대응 방안, 런북(runbook) 또는 프로젝트 문서를 포함한 모든 문서를 최신 상태로 유지한다. * 모든 애플리케이션에 대해 로깅, 모니터링, 알림을 수행한다. 누락된 경우 추가한다. @@ -169,7 +169,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 소프트웨어 공격과 옵저버빌리티(observability) 도구를 이해하는, 훈련된 침해사고 대응팀을 구성한다. -* 자동화 공격을 차단하기 위한 차단 또는 방어하는 도구를 운영한다. +* 자동화 공격을 차단하기 위한 차단 또는 방어 도구를 운영한다. * 설정에 대한 연 1회(또는 그 이상) 하드닝을 수행한다. @@ -192,7 +192,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 OWASP Top 10은 주로 인식 제고 문서이다. 그러나 이는 2003년 처음 발표된 이후로 조직들이 이를 사실상(de facto) 업계 애플리케이션 보안 표준으로 사용해 온 상황을 막지 못했다. OWASP Top 10을 코딩 또는 테스트 표준으로 사용하려는 경우, 이것이 최소 수준의 베이스라인이며 단지 출발점에 불과하다는 점을 인지해야 한다. -OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리케이션 보안 위험을 문서화 한 것이며, 쉽게 테스트 가능한 위험을 다루는 것은 아니라는 점이다. 예를 들어 [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)은 대부분의 테스트 방식으로는 검증하기가 어렵다. 또 다른 예로, 로깅 및 모니터링이 실제로 적용되어 있고, 사용 중이며, 효과적으로 동작하는지 여부를 테스트하는 것은 인터뷰와 사고 대응 사례 샘플링하는 방식으로만 가능하다. 정적 코드 분석 도구는 로깅 부재를 탐지할 수 있으나, 비즈니스 로직 또는 접근 통제가 위험한 보안 사고를 로깅하는지 여부를 판단하는 것은 불가능할 수 있다. 침투 테스트 역시 테스트 환경에서의 탐지/대응 확인에 그칠 수 있으며, 테스트 환경은 운영 환경과 동일한 수준이 아닌 아닌 경우가 많다. +OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리케이션 보안 위험을 문서화한 것이며, 쉽게 테스트 가능한 위험을 다루는 것은 아니라는 점이다. 예를 들어 [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)는 대부분의 테스트 방식으로는 검증하기가 어렵다. 또 다른 예로, 로깅 및 모니터링이 실제로 적용되어 있고, 사용 중이며, 효과적으로 동작하는지 여부를 테스트하는 것은 인터뷰와 사고 대응 사례를 샘플링하는 방식으로만 가능하다. 정적 코드 분석 도구는 로깅 부재를 탐지할 수 있으나, 비즈니스 로직 또는 접근 통제가 위험한 보안 사고를 로깅하는지 여부를 판단하는 것은 불가능할 수 있다. 침투 테스트 역시 테스트 환경에서의 탐지/대응 확인에 그칠 수 있으며, 테스트 환경은 운영 환경과 동일한 수준이 아닌 경우가 많다. 아래는 OWASP Top 10을 표준으로 활용하기에 적절한 상황에 대한 권고사항이다: @@ -296,6 +296,6 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 -애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능하게 정의하도록 설계되었고 보안 안전한 개발 수명 주기(SDLC) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)]((https://owasp.org/www-project-application-security-verification-standard/))를 기준으로 활용하는 것을 권고한다. +애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능하게 정의하도록 설계되었고 보안 안전한 개발 수명 주기(SDLC) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)](https://owasp.org/www-project-application-security-verification-standard/)을 기준으로 활용하는 것을 권고한다. 특히 보안 도구 벤더 관점에서는 ASVS를 기준으로 삼는 것이 유일한 선택지이다. OWASP Top 10은 위험 중심으로 구성되어 있기에, [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) 사례와 마찬가지로 자동화 도구만으로 모든 Top 10 항목을 포괄적으로 탐지, 테스트, 방어하기 어렵다. 따라서, 벤더들은 Top 10을 전부 보장한다고 주장하지 않았으면 한다. 왜냐하면 이는 사실이 아니기 때문이다. From 6b87889cae428f8c63ca9d50314fabf445c1bb58 Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Wed, 7 Jan 2026 23:51:19 +0900 Subject: [PATCH 118/167] Modify 0x00_2025-Introduction.md typos (#27) * Modify 0x00_2025-Introduction.md typos * Modify 0x00_2025-Introduction.md typos --- 2025/docs/ko/0x00_2025-Introduction.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 0b5161dde..7a3f1bc30 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -30,14 +30,14 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ![Mapping](./assets/Top10Mapping-ko.PNG) -* **[A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md)**은 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. -* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**은 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. -* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. -* **[A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. -* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동은 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. -* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**은 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 눈에 띄는 개선이 확인되었다. -* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/A07_-Identificatio_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다 -* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 Software Supply Chain Failures보다 상대적으로 더 로우 레벨(Lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary) 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. +* **[A01:2025 - 불충분한 접근 제어](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. +* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. +* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)** 기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. +* **[A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고리에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. +* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동이 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. +* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 눈에 띄는 개선이 확인되었다. +* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/2021/A07_2021-Identification_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다. +* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 Software Supply Chain Failures보다 상대적으로 더 로우 레벨(Lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary)를 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. * **[A09:2025 - 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 로그에서 발생한 이벤트에 대해 적절한 대응을 위한 알림(Alert) 기능의 중요성을 강조하기 위한 것이다. 알림 체계가 결여된 로깅은 보안 사고를 식별하는 데 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. * **[A10:2025 - 부적절한 예외 처리](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(Fail Open) 등 비정상적인 상태에서 비롯되는 24개 CWE를 포함하고 있다. @@ -49,11 +49,11 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! 이번 OWASP Top 10에서는 이전 버전과 비교하여 일부 카테고리가 변경되었다. 아래는 주요 변경 사항에 대한 요약이다. -이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트 된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE의 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 이번 버전에서도 CWE의 발생 빈도를 분석에서 제외한다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 퍼져있는 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경이 불가피하였다. +이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE의 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 이번 버전에서도 CWE의 발생 빈도를 분석에서 제외한다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 퍼져있는 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경이 불가피하였다. -CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(root Cause) 유형과 증상(symptom) 유형이 있다. 근본 원인의 유형에는 "암호 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근분 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. +CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(root cause) 유형과 증상(symptom) 유형이 있다. 근본 원인의 유형에는 "암호 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근본 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-불충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. -MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다.모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않는 경우 도구, 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 인젝션, 커멘드 인젝션, 크로스 사이트 스크립팅, 하드코딩된 패스워드, 검증 부재, 버퍼 오버플로우, 민감 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. +MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다. 모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않는 경우 도구, 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 인젝션, 커맨드 인젝션, 크로스 사이트 스크립팅, 하드코딩된 패스워드, 검증 부재, 버퍼 오버플로우, 민감 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. ## 카테고리 선정을 위한 데이터 사용법 @@ -71,7 +71,7 @@ CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 ## 커뮤니티 설문 조사를 사용하는 이유 -조사된 데이터는 주로 업계에서 자동화된 방식으로 테스트할 수 있는 범위에 한정되어 있다. 경험 많은 애플리케이션 보안 전문가들과 대화해 보면 아직 데이터에 반영되지 않은 취약점 유형과 트렌드에 대해 존재함을 알 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되며, 이러한 테스트를 자동화하여 대규모 애플리케이션에 적용하는 데는 더 많은 시간이 필요하다. 현재 확인할 수 있는 모든 것은 과거를 돌아보는 것이며, 그 과정에서 지난 해의 트렌드가 충분히 반영되지 않았을 가능성이 있다. +조사된 데이터는 주로 업계에서 자동화된 방식으로 테스트할 수 있는 범위에 한정되어 있다. 경험 많은 애플리케이션 보안 전문가들과 대화해 보면 아직 데이터에 반영되지 않은 취약점 유형과 트렌드에 대해 존재함을 알 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되며, 이러한 테스트를 자동화하여 대규모 애플리케이션에 적용하는 데는 더 많은 시간이 필요하다. 현재 확인할 수 있는 모든 것은 과거를 돌아보는 것이며, 그 과정에서 지난해의 트렌드가 충분히 반영되지 않았을 가능성이 있다. 따라서 데이터가 불완전하기 때문에 10개 카테고리 중 8개만 데이터에서 선정한다. 나머지 2개 카테고리는 Top 10 커뮤니티 설문조사에서 도출되었다. 이를 통해 현장 실무자들이 데이터에 포함되지 않거나 데이터로 표현되기 어려운 주요 위험에 대해 직접 투표할 수 있도록 하였다. From 8cc2570c9a6195a9e6f81cafd1d266047e058594 Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Wed, 7 Jan 2026 23:51:37 +0900 Subject: [PATCH 119/167] Modify A01_2025-Broken_Access_Control.md typos (#31) * Modify A01_2025-Broken_Access_Control.md typos * Modify A01_2025-Broken_Access_Control.md typos --- .../docs/ko/A01_2025-Broken_Access_Control.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md index 4f20390e9..ffacd27bf 100644 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -1,10 +1,10 @@ -# A01:2025 불충분한 접근 제어![icon](../assets/TOP_10_Icons_Final_Broken_Access_Control.png){: style="height:80px;width:80px" align="right"} +# A01:2025 불충분한 접근 제어 ![icon](../assets/TOP_10_Icons_Final_Broken_Access_Control.png){: style="height:80px;width:80px" align="right"} ## 배경. -불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할만한 CWE는 *CWE-200: 비인기자에게 민감정보 노출*, *CWE-201: 전송된 데이터로부터의 민감정보 노출*, *CWE-918: 서버측 요청 위조(SSRF)*, 그리고 *CWE-352: 크로스 사이트 요청 위조(CSRF)* 가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. +불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할 만한 CWE는 *CWE-200: 비인가자에게 민감 정보 노출*, *CWE-201: 전송된 데이터로부터의 민감 정보 노출*, *CWE-918: 서버 측 요청 위조(SSRF)*, 그리고 *CWE-352: 크로스 사이트 요청 위조(CSRF)* 가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. ## 점수표. @@ -56,32 +56,32 @@ ## 설명. -접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 접근 제어 실패는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제, 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔히 발견되는 불충분한 접근 제어 취약점은 목록은 다음과 같다. +접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 접근 제어 실패는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제, 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔히 발견되는 불충분한 접근 제어 취약점 목록은 다음과 같다. * 최소 권한 원칙 위반, 우선 거부 정책(Deny by Default)이 적용되지 않아 제한된 기능, 역할, 사용자들에게만 허용된 접근 권한이 불특정 다수에게 허용되는 경우. * URL 조작(파라미터 변조 및 강제 브라우징), 애플리케이션 내부 상태값 변조, HTML 페이지 변조, 공격 도구를 통한 API 요청 변조와 같은 방식으로 접근 제어가 우회될 수 있다. -* 고유 식별자를 이용해 타인의 계정 조회 수정하는 경우. 즉, 안전하지 않은 직접 객체 참조(Insecure Direct Object References) 취약점. +* 고유 식별자를 이용해 타인의 계정을 조회 및 수정하는 경우. 즉, 안전하지 않은 직접 객체 참조(Insecure Direct Object References) 취약점. * 접근 가능한 API의 POST, PUT 및 DELETE 메서드에 대한 접근 제어가 없는 경우. * 권한 상승. 로그인 과정 없이 다른 사용자로 가장하거나 또는 사용자가 보유한 이상의 권한(예: 관리자 권한)을 획득하는 경우. * 메타데이터 조작. 예를 들어 JSON Web Token(JWT) 접근 제어 토큰을 재전송하거나 변조하는 경우, 권한을 상승시키기 위해 쿠키 또는 히든 필드 값을 조작하는 행위, 또는 JWT 무효화가 없거나 우회하여 악용하는 경우. * 교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)의 잘못된 설정으로 비인가자 또는 신뢰할 수 없는 출처(Origin)에서 API에 접근할 수 있는 경우. -* 강제 브라우징(URL 추측)을 통해 인증이 필요한 페이지에 인증없이 접근하거나, 일반 사용자가 권한이 필요한 페이지에 접근할 경우. +* 강제 브라우징(URL 추측)을 통해 인증이 필요한 페이지에 인증 없이 접근하거나, 일반 사용자가 권한이 필요한 페이지에 접근할 경우. ## 대응 방안. -접근 제어는 공격자가 접근 제어 검사나 메타데이터를 변조할 수 없는 곳에서 신뢰할 수 있는 서버측 코드나 서버리스 API들로 수행될 때 실효성이 있다. +접근 제어는 공격자가 접근 제어 검사나 메타데이터를 변조할 수 없는 곳에서 신뢰할 수 있는 서버 측 코드나 서버리스 API들로 수행될 때 실효성이 있다. -* 공개 리소스 제외 모든 리소스는 우선 거부 정책(Deny By Default)을 따라야 한다. -* 접근제어 매커니즘을 구현한 후엔 전체 애플리케이션에 재사용하고 교차 출처 리소스 검증(CORS) 사용을 최소화 한다. +* 공개 리소스를 제외한 모든 리소스는 우선 거부 정책(Deny By Default)을 따라야 한다. +* 접근 제어 메커니즘을 구현한 후에는 전체 애플리케이션에 재사용하고 교차 출처 리소스 검증(CORS) 사용을 최소화한다. * 모델 수준의 접근 제어는 레코드 소유자 기준으로 접근 권한을 제한하도록 한다. 다른 사용자가 임의의 레코드에 대해 생성, 조회, 수정, 삭제를 수행하도록 하지 못하게 한다. * 애플리케이션의 고유한 비즈니스 제약사항은 도메인 모델에 의해 검사한다. -* 웹 서버의 디렉터리 리스팅(directory listing)를 비활성화하고, 웹 루트(web root) 내에 파일 메타데이터(예: .git) 및 백업 파일이 존재하지 않도록 해야한다. +* 웹 서버의 디렉터리 리스팅(directory listing)를 비활성화하고, 웹 루트(web root) 내에 파일 메타데이터(예: .git) 및 백업 파일이 존재하지 않도록 해야 한다. * 접근 제어 실패를 로깅하고 필요한 경우(예: 반복적인 실패 발생 시)에 관리자에게 알린다. * 자동화된 공격 도구로 인한 피해를 최소화하기 위해 API 및 컨트롤러 접근에 대한 속도 제한(rate limit)을 구현한다. -* 상태기반 세션 식별자는 로그아웃 후 무효화 한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효시간을 부여하여 공격을 위한 기회를 최소화하고, 유효기간이 긴 JWT 토큰은 리프레쉬 토큰 사용을 고려하며, OAuth 표준에 따른 토큰 취소도 고려한다. +* 상태 기반 세션 식별자는 로그아웃 후 무효화한다. 상태를 저장하지 않는 JWT 토큰의 경우 짧은 유효 시간을 부여하여 공격을 위한 기회를 최소화하고, 유효 기간이 긴 JWT 토큰은 리프레시 토큰 사용을 고려하며, OAuth 표준에 따른 토큰 취소도 고려한다. * 간단하고 선언적 접근 제어를 제공하는 확립된 툴킷과 패턴을 사용한다. 개발자와 QA 담당자는 단위 및 통합 테스트에서 접근 제어를 포함해야 한다. @@ -105,7 +105,7 @@ https://example.com/app/accountInfo?acct=notmyacct ``` -**시나리오 2:** 공격자는 단순하게 목적 URL로 브라우저를 이용해 접속할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. +**시나리오 2:** 공격자는 단순하게 대상 URL로 브라우저를 이용해 접속할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. ``` @@ -114,10 +114,10 @@ https://example.com/app/admin_getappInfo ``` -먄약 인증되지 않은 사용자가 두 페이지 중 하나에 접근할 수 있다면, 보안 취약점으로 간주한다. 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이 또한 마찬가지다. +만약 인증되지 않은 사용자가 두 페이지 중 하나에 접근할 수 있다면, 보안 취약점으로 간주한다. 만약 관리자가 아닌 자가 관리자 페이지 접근이 가능하다면 이 또한 마찬가지다. -**시나리오 3:** 애플리케이션이 모든 접근 제어를 프론트 엔드에서만 구현할 경우. 공격자가 브라우저에서 동작하는 자바 스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없지만, 커멘드 라인에서 단순하게 curl 명령어를 실행하면 접속할 수 있다. +**시나리오 3:** 애플리케이션이 모든 접근 제어를 프론트엔드에서만 구현할 경우. 공격자가 브라우저에서 동작하는 자바스크립트 코드 때문에 `https://example.com/app/admin_getappInfo` 에 접근할 수 없지만, 커맨드 라인에서 단순하게 curl 명령어를 실행하면 접속할 수 있다. ``` $ curl https://example.com/app/admin_getappInfo From dd56cdffd2daa11b65d095634ab968088054f43a Mon Sep 17 00:00:00 2001 From: YongDeokasd <125789591+YongDeokasd@users.noreply.github.com> Date: Wed, 7 Jan 2026 23:52:18 +0900 Subject: [PATCH 120/167] Merge korean translation for A03_2025-Software_Supply_Chain_Failures * Create A03_2025-Software_Supply_Chain_Failures.md * fix some words Updated the content for clarity and accuracy regarding software supply chain failures, including changes to definitions, examples, and recommendations. * remove comments Removed unnecessary comment about the translation of 'breakdown' in the context of software supply chain failures. * Reflet reviews * Update A03_2025-Software_Supply_Chain_Failures.md * update... * reflect reviews --- ...A03_2025-Software_Supply_Chain_Failures.md | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md new file mode 100644 index 000000000..cc88c7ee0 --- /dev/null +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -0,0 +1,166 @@ +# A03:2025 소프트웨어 공급망 실패![icon](../assets/TOP_10_Icons_Final_Vulnerable_Outdated_Components.png){: style="height:80px;width:80px" align="right"} + + +## 배경. + +소프트웨어 공급망 실패는 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정하였다. 2013년 TOP 10에 "A9 - 사용 중인 컴포넌트 내 알려진 취약점" 으로 처음 등장한 이후, 해당 카테고리는 "알려진 취약점" 외에도 "모든 공급망 실패"를 포함하도록 범위가 확장되었다. 범위가 확대됨에도 불구하고, 공급망 실패는 여전히 식별이 어려우며, 관련 CWE와 매핑된 CVE가 11개에 불과하다. 그러나, 수집한 데이터를 테스트하고 보고한 결과에 따르면 이번 카테고리는 5.19%라는 높은 평균 사고 발생률을 보였고, 관련된 CWE로는 *CWE-477: 더 이상 사용되지 않는 기능 사용*, *CWE-1104: 관리되지 않은 외부 컴포넌트 사용*, *CWE-1329: 업데이트할 수 없는 컴포넌트에 대한 의존*, 그리고 *CWE-1395: 취약한 외부 컴포넌트 의존* 이 있다. + +## 점수표. + + + + + + + + + + + + + + + + + + + + + + + + + +
해당되는 CWE 개수 + 최대 취약점 발생률 + 평균 취약점 발생률 + 최대 테스트 커버리지 + 평균 테스트 커버리지 + 가중 평균 악용도 + 가중 평균 영향도 + 총 발생 건수 + 총 CVE 건수 +
6 + 9.56% + 5.72% + 65.42% + 27.47% + 8.17 + 5.23 + 215,248 + 11 +
+ + + +## 설명. + +소프트웨어 공급망 실패는 소프트웨어 개발, 배포, 업데이트하는 과정에서 발생하는 장애 또는 침해를 의미한다. 이는 주로 외부 코드, 도구, 시스템이 신뢰하는 의존성들에서의 악의적인 변조나 취약점이 원인이 된다. + +다음과 같은 경우 취약할 가능성이 있다. + +* 사용하는 모든 컴포넌트 버전을 추적하지 않는 경우.(클라이언트, 서버 사이드 모두 포함) 여기서의 컴포넌트는 직접 사용하는 컴포넌트 뿐만 아니라 중첩되거나 전이 의존성(Transitive Dependencies)도 포함한다. +* 소프트웨어가 취약하거나, 더 이상 지원하지 않거나, 오래된 버전인 경우. 이는 OS, 웹/애플리케이션 서버, 데이터베이스 관리 시스템(DBMS), 애플리케이션, API, 모든 컴포넌트, 런타임 환경 그리고 모든 라이브러리를 포함한다. +* 주기적으로 취약점을 점검하지 않거나 사용 중인 컴포넌트에 대한 보안 공지를 확인하지 않는 경우. +* 변경 관리 프로세스나 공급망 내 변경 추적 기능이 없는 경우. 이는 IDE 추적, IDE 확장 기능 또는 업데이트, 조직 내 코드 레포지터리, 샌드박스, 이미지와 라이브러리 레포지터리, 생성되거나 저장된 아티팩트 등을 포함한다. 모든 공급망에 대한 영역은 문서화되어야 하며, 특히 변경에 관한 사항은 문서화에 꼭 포함하여야 한다. +* 공급망에 대한 모든 영역에 보안 하드닝이 없는 경우. 특히 접근 제어, 애플리케이션 최소 권한에 관한 사항. +* 공급망 시스템에 직무 분리 사항이 없는 경우. 다른 사람의 감독 없이 공급망 내 코드를 작성하거나 운영 환경에 배포되는 전 과정을 단독으로 수행해선 안 된다. +* 신뢰할 수 없는 출처의 컴포넌트나 기술 스택이 운영 환경에 영향을 미치는 경우. +* 기반 플랫폼, 프레임워크, 의존성을 위험 기반 또는 적시에 고치거나 업그레이드하지 않는 경우. 이는 변경 관리를 월, 분기 단위로 작업할 때 흔히 발생하며, 취약점 조치 전 조직에 불필요한 위험을 수일 또는 수개월 간 노출시킬 수 있다. +* 소프트웨어 개발자가 업데이트, 업그레이드, 패치된 라이브러리의 호환성을 테스트하지 않는 경우. +* 시스템 내 모든 영역에 보안 설정이 미비하거나 없는 경우. (참고. [A02:2025-보안 설정 오류](https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/)) +* CI/CD 파이프라인이 빌드, 배포 대상 시스템보다 보안성이 약한 경우. 특히 파이프라인이 복잡할수록 취약해질 수 있다. + +## 대응 방안. + +패치 관리 프로세스 내 다음과 같은 사항이 포함되어야 한다. + + + +* 전체 소프트웨어에 대한 소프트웨어 구성 목록(SBOM)을 중앙 생성 및 관리한다. +* 직접적 의존성, 전이 의존성(Transitive Dependency) 등을 추적한다. +* 불필요 의존성, 기능, 컴포넌트, 파일 그리고 문서를 지움으로써 공격 가능 범위를 축소한다. +* OWASP Dependency Track, OWASP Dependency Check, retire.js 등과 같은 도구를 사용함으로써 클라이언트, 서버 사이드 컴포넌트(예: 프레임워크, 라이브러리) 버전 지속 목록화 한다. +* 사용 중인 컴포넌트에 대한 취약점들을 CVE(Common Vulnerability and Exposures), NVD(National Vulnerability Database), OSV(Open Source Vulnerabilities) 를 통해 지속 모니터링한다. 이를 위해 소프트웨어 구성 분석, 소프트웨어 공급망, 프로세스 자동화를 위한 소프트웨어 구성 목록(SBOM) 도구 사용 또는 사용 중인 컴포넌트에 대한 보안 취약점 공지 구독을 통해서도 관리할 수 있다. +* 보안 링크를 통해 공식 소스로부터 컴포넌트 다운로드를 하여야 하며, 조작되거나 악성 컴포넌트로 변경되는 경우를 방지하기 위해 서명된 패키지 사용과 체크를 권고한다. (참고. [A08:2025-소프트웨어, 데이터 무결성 실패](https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/)) +* 사용할 의존성 버전 선택이 가능하고 필요할 때 업그레이드 가능해야 한다. +* 관리되지 않거나 보안 패치가 이루어지지 않는 오래된 버전의 라이브러리, 컴포넌트 사용 여부를 모니터링한다. 만약 패치가 가능하지 않다면 대안을 선택해야 하는 것을 고려해야 하며, 이 또한 가능하지 않다면 가상 패치를 적용해 발견된 문제에 대해 모니터링, 탐지, 방어하는 방안을 고려한다. +* CI/CD, IDE, 기타 다른 개발 도구를 주기적으로 업데이트한다. +* 모든 시스템은 동시 업데이트가 되지 않아야 한다. 신뢰된 공급업체가 침해된 경우를 대비하여 노출을 제한하기 위해 점진적 배포나 카나리 배포를 한다. + +다음과 같은 변경 사항을 추적하기 위해 변경 관리 프로세스 또는 추적 시스템을 마련한다. + +* CI/CD 설정 (모든 빌드 도구와 파이프라인) +* 코드 레포지터리 +* 샌드박스 영역 +* 개발자 IDE +* 소프트웨어 구성 목록 도구(SBOM tooling)와 생성된 아티팩트 +* 로깅 시스템과 로그 +* 소프트웨어 서비스(SaaS) 같은 통합된 외부 서비스 +* 아티팩트 레포지터리 +* 컨테이너 레지스트리 + + +다음과 같은 시스템의 경우 보안 하드닝을 해야하며, 이는 다중 인증(MFA)과 IAM 관리를 포함한다. + +* 코드 레포지터리: 백업, 보호된 브런치, 민감 데이터 커밋 방지 +* 개발자 워크스테이션: 주기적 패치, 다중 인증(MFA), 모니터링 등 +* 빌드 서버와 CI/CD 서버: 직무 분리, 접근 제어, 서명된 빌드, 환경변수 내 민감 데이터, 로그 조작 방지 등 +* 아티팩트: 출처(Provenance), 서명, 타임스탬프를 통해 무결성을 보장한다. 환경마다 재빌드하지 않고 동일한 아티팩트를 배포하며, 빌드의 불변성을 검증한다. +* 코드형 인프라(Infrastructure as Code): 모든 코드 관리, PR 사용과 버전 관리 포함 + +모든 조직은 애플리케이션 또는 포트폴리오의 전체 생애주기 동안 업데이트나 설정 변경 사항을 모니터링하고, 분류(Triage)하며, 적용하기 위한 지속적인 계획을 수립, 유지해야 한다. + +## 공격 시나리오 예시. + +**시나리오 1:** 신뢰된 공급업체가 멀웨어에 감염되어, 해당 소프트웨어를 업그레이드하는 과정에서 사용자 시스템까지 침해되는 사례이다. 가장 유명한 예시는 다음과 같다. + +* 2019년 솔라윈즈(Solarwinds) 침해 사고로 약 18,000개의 조직이 침해되었다.[https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) + +**시나리오 2:** 신뢰된 공급업체가 침해되어 특정 조건에서만 악성 행위가 동작하는 사례다. + +* 2025년에 바이빗(Bybit)은 [월렛 소프트웨어에서의 공급망 공격](https://www.sygnia.co/blog/sygnia-investigation-bybit-hack/)으로15억 달러 가량을 탈취당했다. 해당 악성 코드는 대상 월렛 사용될 때만 실행되었다. + +**시나리오 3:** 2025년 발생한 [`Shai-Hulud` 공급망 공격](https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem)은 최초로 성공한 자기 전파형 npm 웜이다. 공격자는 인기 패키지에 악성코드를 주입해 새 버전으로 배포했으며, post-install 스크립트를 통해 민감 정보를 수집하고 퍼블릭 GitHub 레포지터리로 유출했다. 해당 멀웨어는 피해자 환경에서 npm 토큰을 탐지하면 이를 이용해 접근 가능한 모든 패키지에 악성 버전을 자동으로 푸시했다. 이 웜은 npm에 의해 차단되기 전까지 500개 이상의 패키지 버전에 영향을 미쳤다. 이번 공격은 고도화되고 빠르게 전파되어 심각한 피해를 입혔으며, 개발자 환경을 직접 표적으로 삼아 개발자 자신이 공급망 공격의 주요 대상이 될 수 있음을 보여주었다. + +**시나리오 4:** 컴포넌트는 일반적으로 애플리케이션과 동일한 권한으로 실행되므로, 컴포넌트의 취약점이 있으면 심각한 영향을 미칠 수 있다. 이러한 취약점은 우발적(예: 코딩 에러)이거나, 의도적(예: 컴포넌트 내 백도어)일 수 있다. 악용 가능한 컴포넌트 취약점 대표적 사례는 다음과 같다. + +* CVE-2017-5638: Struts 2의 원격 코드 실행 취약점으로, 서버에서 임의 코드 실행 가능하여 다수의 심각한 침해 사고의 원인이 되었다. +* [CVE-2021-44228](https://github.com/advisories/GHSA-jfh8-c2jp-5v3q "CVE-2021-44228")(Log4Shell): Apache Log4j의 제로데이 원격 코드 실행 취약점으로, 랜섬웨어, 암호화폐 채굴 등 다양한 공격 캠페인에 악용되었다. + + +## 참조. + +* [OWASP Application Security Verification Standard: V15 Secure Coding and Architecture](https://owasp.org/www-project-application-security-verification-standard/) +* [OWASP Cheat Sheet Series: Dependency Graph SBOM](https://cheatsheetseries.owasp.org/cheatsheets/Dependency_Graph_SBOM_Cheat_Sheet.html) +* [OWASP Cheat Sheet Series: Vulnerable Dependency Management](https://cheatsheetseries.owasp.org/cheatsheets/Vulnerable_Dependency_Management_Cheat_Sheet.html) +* [OWASP Dependency-Track](https://owasp.org/www-project-dependency-track/) +* [OWASP CycloneDX](https://owasp.org/www-project-cyclonedx/) +* [OWASP Application Security Verification Standard: V1 Architecture, design and threat modelling](https://owasp-aasvs.readthedocs.io/en/latest/v1.html) +* [OWASP Dependency Check (for Java and .NET libraries)](https://owasp.org/www-project-dependency-check/) +* OWASP Testing Guide - Map Application Architecture (OTG-INFO-010) +* [OWASP Virtual Patching Best Practices](https://owasp.org/www-community/Virtual_Patching_Best_Practices) +* [The Unfortunate Reality of Insecure Libraries](https://www.scribd.com/document/105692739/JeffWilliamsPreso-Sm) +* [MITRE Common Vulnerabilities and Exposures (CVE) search](https://www.cve.org) +* [National Vulnerability Database (NVD)](https://nvd.nist.gov) +* [Retire.js for detecting known vulnerable JavaScript libraries](https://retirejs.github.io/retire.js/) +* [GitHub Advisory Database](https://github.com/advisories) +* Ruby Libraries Security Advisory Database and Tools +* [SAFECode Software Integrity Controls (PDF)](https://safecode.org/publication/SAFECode_Software_Integrity_Controls0610.pdf) +* [Glassworm supply chain attack](https://thehackernews.com/2025/10/self-spreading-glassworm-infects-vs.html) +* [PhantomRaven supply chain attack campaign](https://thehackernews.com/2025/10/phantomraven-malware-found-in-126-npm.html) + + +## 해당되는 CWE. + +* [CWE-447 Use of Obsolete Function](https://cwe.mitre.org/data/definitions/447.html) + +* [CWE-1035 2017 Top 10 A9: Using Components with Known Vulnerabilities](https://cwe.mitre.org/data/definitions/1035.html) + +* [CWE-1104 Use of Unmaintained Third Party Components](https://cwe.mitre.org/data/definitions/1104.html) + +* [CWE-1329 Reliance on Component That is Not Updateable](https://cwe.mitre.org/data/definitions/1329.html) + +* [CWE-1357 Reliance on Insufficiently Trustworthy Component](https://cwe.mitre.org/data/definitions/1357.html) + +* [CWE-1395 Dependency on Vulnerable Third-Party Component](https://cwe.mitre.org/data/definitions/1395.html) From 2b5fd36c8da62d71d4c5c38019c855392a62246b Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 02:03:15 +0900 Subject: [PATCH 121/167] Update the description of the National Vulnerability Database. --- 2025/docs/ko/0x00_2025-Introduction.md | 2 +- 2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 7a3f1bc30..1553dddcc 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -62,7 +62,7 @@ MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하 CVSSv2에서는 Exploit과 (Technical) Impact 모두 최대 10.0까지 가능하였으나, 공식에 따라 Exploit은 60%, Impact는 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 Exploit 6.0, Impact 4.0으로 제한되었다. 가중치를 고려한 결과, Impact 점수는 CVSSv3에서 평균적으로 약 1.5점 상승하였고, Exploitability는 평균적으로 약 0.5점 하락하였다. -OWASP Dependency Check에서 추출한 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD) 데이터에는 CWE에 매핑된 CVE 기록이 약 175,000건(2021년 125,000건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년 241개에서 증가)이다. 추출된 약 220,000건의 CVE 중 160,000건은 CVSS v2 점수를, 156,000건은 CVSS v3 점수를, 6,000건은 CVSS v4 점수를 보유하고 있다. 다수의 CVE가 복수의 점수를 보유하고 있어 합계가 220,000건을 초과한다. +OWASP Dependency Check에서 추출한 미국 정부가 운영하는 취약점 데이터베이스(National Vulnerability Database) 데이터에는 CWE에 매핑된 CVE 기록이 약 175,000건(2021년 125,000건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년 241개에서 증가)이다. 추출된 약 220,000건의 CVE 중 160,000건은 CVSS v2 점수를, 156,000건은 CVSS v3 점수를, 6,000건은 CVSS v4 점수를 보유하고 있다. 다수의 CVE가 복수의 점수를 보유하고 있어 합계가 220,000건을 초과한다. Top 10 2025에서는 다음과 같은 방식으로 평균 Exploit 및 Impact 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 보유한 비율과 CVSSv2 점수를 보유한 나머지 비율에 따라 Exploit 및 Impact 점수에 가중치를 부여하여 전체 평균을 산출하였다. 이 평균값을 데이터셋의 CWE에 매핑하여 위험 산정 공식의 나머지 절반인 Exploit 및 (Technical) Impact 점수로 활용하였다. diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index 04b765e21..b72d0d021 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -54,7 +54,7 @@ ## 카테고리를 선택하고 순위를 매기기 위해 데이터가 사용되는 방식 -2017년에는 발생률을 기준으로 가능성을 산정하여 카테고리를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성, 탐지 가능성, 기술적 영향을 기준으로 순위를 매겼다. 2021년에는 미국 국가 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. +2017년에는 발생률을 기준으로 가능성을 산정하여 카테고리를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성, 탐지 가능성, 기술적 영향을 기준으로 순위를 매겼다. 2021년에는 미국 정부가 운영하는 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. 우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 악용(Exploit) 점수와 영향(Impact) 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. From 0efda788841d89b09637145a0aaa8691e6f19224 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 02:55:58 +0900 Subject: [PATCH 122/167] Refine Korean translation of A03 for clarity and accuracy --- ...A03_2025-Software_Supply_Chain_Failures.md | 86 +++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index cc88c7ee0..74e1a10ec 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -1,4 +1,4 @@ -# A03:2025 소프트웨어 공급망 실패![icon](../assets/TOP_10_Icons_Final_Vulnerable_Outdated_Components.png){: style="height:80px;width:80px" align="right"} +# A03:2025 소프트웨어 공급망 실패 ![icon](../assets/TOP_10_Icons_Final_Vulnerable_Outdated_Components.png){: style="height:80px;width:80px" align="right"} ## 배경. @@ -20,9 +20,9 @@ 평균 테스트 커버리지 - 가중 평균 악용도 + 평균 가중 악용도 - 가중 평균 영향도 + 평균 가중 영향도 총 발생 건수 @@ -55,21 +55,21 @@ ## 설명. -소프트웨어 공급망 실패는 소프트웨어 개발, 배포, 업데이트하는 과정에서 발생하는 장애 또는 침해를 의미한다. 이는 주로 외부 코드, 도구, 시스템이 신뢰하는 의존성들에서의 악의적인 변조나 취약점이 원인이 된다. +소프트웨어 공급망 실패는 소프트웨어를 개발, 배포, 업데이트하는 과정에서 발생하는 장애 또는 침해를 의미한다. 이는 주로 외부 코드, 도구, 시스템이 신뢰하는 의존성이 악의적으로 변조되거나 의존성에 존재하는 취약점이 원인이 된다. -다음과 같은 경우 취약할 가능성이 있다. +다음과 같은 경우 취약하다. -* 사용하는 모든 컴포넌트 버전을 추적하지 않는 경우.(클라이언트, 서버 사이드 모두 포함) 여기서의 컴포넌트는 직접 사용하는 컴포넌트 뿐만 아니라 중첩되거나 전이 의존성(Transitive Dependencies)도 포함한다. +* 사용하는 모든 컴포넌트(클라이언트 사이드, 서버 사이드 모두) 버전을 추적하지 않는 경우. 여기에서 컴포넌트는 직접 사용하는 컴포넌트뿐만 아니라 중첩 (전이) 의존성도 포함한다. * 소프트웨어가 취약하거나, 더 이상 지원하지 않거나, 오래된 버전인 경우. 이는 OS, 웹/애플리케이션 서버, 데이터베이스 관리 시스템(DBMS), 애플리케이션, API, 모든 컴포넌트, 런타임 환경 그리고 모든 라이브러리를 포함한다. -* 주기적으로 취약점을 점검하지 않거나 사용 중인 컴포넌트에 대한 보안 공지를 확인하지 않는 경우. -* 변경 관리 프로세스나 공급망 내 변경 추적 기능이 없는 경우. 이는 IDE 추적, IDE 확장 기능 또는 업데이트, 조직 내 코드 레포지터리, 샌드박스, 이미지와 라이브러리 레포지터리, 생성되거나 저장된 아티팩트 등을 포함한다. 모든 공급망에 대한 영역은 문서화되어야 하며, 특히 변경에 관한 사항은 문서화에 꼭 포함하여야 한다. -* 공급망에 대한 모든 영역에 보안 하드닝이 없는 경우. 특히 접근 제어, 애플리케이션 최소 권한에 관한 사항. -* 공급망 시스템에 직무 분리 사항이 없는 경우. 다른 사람의 감독 없이 공급망 내 코드를 작성하거나 운영 환경에 배포되는 전 과정을 단독으로 수행해선 안 된다. -* 신뢰할 수 없는 출처의 컴포넌트나 기술 스택이 운영 환경에 영향을 미치는 경우. -* 기반 플랫폼, 프레임워크, 의존성을 위험 기반 또는 적시에 고치거나 업그레이드하지 않는 경우. 이는 변경 관리를 월, 분기 단위로 작업할 때 흔히 발생하며, 취약점 조치 전 조직에 불필요한 위험을 수일 또는 수개월 간 노출시킬 수 있다. +* 사용 중인 컴포넌트에 대해 주기적으로 취약점을 스캔하지 않거나 보안 공지를 구독하지 않는 경우. +* 공급망의 변경을 관리하는 절차가 없거나, 변경 이력을 추적하지 못하는 경우. 여기에는 사용 중인 IDE와 IDE 확장 프로그램(extension) 및 업데이트를 추적하는 것, 조직의 코드 저장소에서 발생하는 변경 사항, 샌드박스, 이미지 및 라이브러리 저장소, 아티팩트가 생성되고 보관되는 방식 등도 모두 포함됩니다. 공급망을 이루는 모든 요소는 문서화되어야 하며, 특히 변경 사항은 반드시 기록으로 남겨야 합니다. +* 공급망에 대한 모든 영역에 보안 하드닝이 없는 경우. 특히 접근 제어 부분과 애플리케이션 최소 권한 원칙 적용을 신경 쓰지 않은 경우. +* 공급망 시스템에 직무 분리가 없는 경우. 다른 사람의 검토와 승인 없이 작성된 코드를 운영 환경에 배포하면 안 된다. +* 기술 스택의 어느 계층에서든 신뢰할 수 없는 출처의 컴포넌트가 사용되고 있거나, 이에 따라 운영 환경이 영향받는 경우. +* 기반이 되는 플랫폼, 프레임워크, 의존성을 위험도에 따라 또는 적시에 수정하거나 업그레이드하지 않는 경우. 이는 보통 변경 관리 절차 때문에 패치를 매월, 매 분기 단위로 작업할 때 흔히 발생하며, 취약점 조치 전까지 조직에 불필요한 위험을 수일 또는 수개월간 노출할 수 있다. * 소프트웨어 개발자가 업데이트, 업그레이드, 패치된 라이브러리의 호환성을 테스트하지 않는 경우. -* 시스템 내 모든 영역에 보안 설정이 미비하거나 없는 경우. (참고. [A02:2025-보안 설정 오류](https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/)) -* CI/CD 파이프라인이 빌드, 배포 대상 시스템보다 보안성이 약한 경우. 특히 파이프라인이 복잡할수록 취약해질 수 있다. +* 시스템의 모든 구성 요소에 대한 설정이 안전하지 않은 경우. (참고. [A02:2025-보안 설정 오류](https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/)) +* CI/CD 파이프라인의 보안이 빌드하고 배포하는 시스템보다 취약한 경우, 특히 파이프라인이 복잡할수록 취약하다. ## 대응 방안. @@ -77,56 +77,56 @@ -* 전체 소프트웨어에 대한 소프트웨어 구성 목록(SBOM)을 중앙 생성 및 관리한다. -* 직접적 의존성, 전이 의존성(Transitive Dependency) 등을 추적한다. -* 불필요 의존성, 기능, 컴포넌트, 파일 그리고 문서를 지움으로써 공격 가능 범위를 축소한다. -* OWASP Dependency Track, OWASP Dependency Check, retire.js 등과 같은 도구를 사용함으로써 클라이언트, 서버 사이드 컴포넌트(예: 프레임워크, 라이브러리) 버전 지속 목록화 한다. -* 사용 중인 컴포넌트에 대한 취약점들을 CVE(Common Vulnerability and Exposures), NVD(National Vulnerability Database), OSV(Open Source Vulnerabilities) 를 통해 지속 모니터링한다. 이를 위해 소프트웨어 구성 분석, 소프트웨어 공급망, 프로세스 자동화를 위한 소프트웨어 구성 목록(SBOM) 도구 사용 또는 사용 중인 컴포넌트에 대한 보안 취약점 공지 구독을 통해서도 관리할 수 있다. -* 보안 링크를 통해 공식 소스로부터 컴포넌트 다운로드를 하여야 하며, 조작되거나 악성 컴포넌트로 변경되는 경우를 방지하기 위해 서명된 패키지 사용과 체크를 권고한다. (참고. [A08:2025-소프트웨어, 데이터 무결성 실패](https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/)) -* 사용할 의존성 버전 선택이 가능하고 필요할 때 업그레이드 가능해야 한다. -* 관리되지 않거나 보안 패치가 이루어지지 않는 오래된 버전의 라이브러리, 컴포넌트 사용 여부를 모니터링한다. 만약 패치가 가능하지 않다면 대안을 선택해야 하는 것을 고려해야 하며, 이 또한 가능하지 않다면 가상 패치를 적용해 발견된 문제에 대해 모니터링, 탐지, 방어하는 방안을 고려한다. -* CI/CD, IDE, 기타 다른 개발 도구를 주기적으로 업데이트한다. -* 모든 시스템은 동시 업데이트가 되지 않아야 한다. 신뢰된 공급업체가 침해된 경우를 대비하여 노출을 제한하기 위해 점진적 배포나 카나리 배포를 한다. +* 전체 소프트웨어에 대한 소프트웨어 자재 명세서(Software Bill of Materials, SBOM)를 중앙에서 생성 및 관리한다. +* 직접 추가한 의존성만 추적할 것이 아니라, 그 의존성의 (전이) 의존성, 그리고 그다음 단계 의존성까지 추적한다. +* 사용하지 않는 의존성, 불필요하지 않은 기능, 컴포넌트, 파일 그리고 문서를 지움으로써 공격 표면을 축소한다. +* OWASP Dependency Track, OWASP Dependency Check, retire.js 등과 같은 도구를 활용해서 클라이언트 사이드와 서버 사이드 컴포넌트(예: 프레임워크, 라이브러리) 및 그 의존성의 버전 정보를 지속적으로 목록화한다. +* 사용 중인 컴포넌트에 대한 취약점들을 CVE(Common Vulnerabilities and Exposures), 미국 정부가 운영하는 취약점 데이터베이스(National Vulnerability Database), [OSV(Open Source Vulnerabilities)](https://osv.dev/)와 같은 출처를 지속적으로 모니터링한다. 이를 위해 소프트웨어 구성 분석(software composition analysis, SCA) 도구, 소프트웨어 공급망 도구, 보안에 초점이 맞춰진 SBOM 도구를 사용해 이 과정을 자동화한다. 사용 중인 컴포넌트와 관련된 보안 취약점 알림을 구독한다. +* 공식(신뢰할 수 있는) 출처에서 암호화가 적용된 링크를 통해서만 컴포넌트를 획득한다. 변조되었거나 악성 컴포넌트가 포함될 가능성을 줄이기 위해 서명된 패키지를 우선시한다. (참고. [A08:2025-소프트웨어, 데이터 무결성 실패](https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/)) +* 의존성의 어떤 버전을 사용할지 의도적으로 선택하고, 필요가 있을 때만 업그레이드한다. +* 관리되지 않거나 보안 패치가 이루어지지 않는 오래된 버전의 라이브러리, 컴포넌트 사용 여부를 모니터링한다. 만약 패치가 불가능하다면 대체품으로 마이그레이션하는 것을 고려한다. 그것 또한 불가능하다면 가상 패치(virtual patch)를 적용해 발견된 문제에 대해 모니터링, 탐지, 방어하는 방안을 고려한다. +* CI/CD, IDE, 기타 개발 도구를 주기적으로 업데이트한다. +* 모든 시스템에 업데이트를 동시에 배포하는 것을 피한다. 신뢰하는 벤더가 침해된 경우를 대비하여 공격의 영향을 제한하기 위해 점진적 배포나 카나리 배포한다. -다음과 같은 변경 사항을 추적하기 위해 변경 관리 프로세스 또는 추적 시스템을 마련한다. +다음과 같은 항목의 변경 사항을 추적하기 위해 변경 관리 프로세스 또는 추적 시스템을 마련한다. -* CI/CD 설정 (모든 빌드 도구와 파이프라인) -* 코드 레포지터리 +* CI/CD 설정(모든 빌드 도구와 파이프라인) +* 코드 저장소 * 샌드박스 영역 * 개발자 IDE -* 소프트웨어 구성 목록 도구(SBOM tooling)와 생성된 아티팩트 +* 소프트웨어 자재 명세서(SBOM) 도구와 생성된 아티팩트 * 로깅 시스템과 로그 -* 소프트웨어 서비스(SaaS) 같은 통합된 외부 서비스 -* 아티팩트 레포지터리 +* SaaS 등 외부 서비스와의 연동 +* 아티팩트 저장소 * 컨테이너 레지스트리 -다음과 같은 시스템의 경우 보안 하드닝을 해야하며, 이는 다중 인증(MFA)과 IAM 관리를 포함한다. +다음과 같은 시스템을 하드닝하라. 하드닝에는 MFA를 활성화하고 IAM을 권한을 제한하는 조치가 포함된다. -* 코드 레포지터리: 백업, 보호된 브런치, 민감 데이터 커밋 방지 +* 코드 저장소: 시크릿 커밋 금지, 브랜치 보호, 백업 설정 * 개발자 워크스테이션: 주기적 패치, 다중 인증(MFA), 모니터링 등 -* 빌드 서버와 CI/CD 서버: 직무 분리, 접근 제어, 서명된 빌드, 환경변수 내 민감 데이터, 로그 조작 방지 등 -* 아티팩트: 출처(Provenance), 서명, 타임스탬프를 통해 무결성을 보장한다. 환경마다 재빌드하지 않고 동일한 아티팩트를 배포하며, 빌드의 불변성을 검증한다. -* 코드형 인프라(Infrastructure as Code): 모든 코드 관리, PR 사용과 버전 관리 포함 +* 빌드 서버와 CI/CD 서버: 직무 분리, 접근 제어, 서명된 빌드, 환경변수 내 시크릿, 변조 감지 로그(tamper-evident log) 등 +* 아티팩트: 프로비넌스(provenance), 서명, 타임스탬프를 통해 무결성을 보장. 환경마다 재빌드하지 않고 동일한 아티팩트를 사용, 빌드의 불변성 보장 +* 코드형 인프라(Infrastructure as Code): 다른 모든 코드와 마찬가지로 PR과 버전 관리를 포함해 코드로 관리 -모든 조직은 애플리케이션 또는 포트폴리오의 전체 생애주기 동안 업데이트나 설정 변경 사항을 모니터링하고, 분류(Triage)하며, 적용하기 위한 지속적인 계획을 수립, 유지해야 한다. +모든 조직은 해당 애플리케이션 또는 포트폴리오의 생명 주기 동안, 업데이트나 설정 변경 사항을 계속 감시하고 중요도를 판단해 우선순위를 정한 뒤 적시에 반영할 수 있는 상시적인 운영 계획을 갖춰야 한다. ## 공격 시나리오 예시. -**시나리오 1:** 신뢰된 공급업체가 멀웨어에 감염되어, 해당 소프트웨어를 업그레이드하는 과정에서 사용자 시스템까지 침해되는 사례이다. 가장 유명한 예시는 다음과 같다. +**시나리오 1:** 신뢰하는 벤더가 악성코드에 감염되어, 업데이트하는 과정에서 내부 시스템까지 침해되는 경우. 가장 유명한 사례는 다음과 같다. -* 2019년 솔라윈즈(Solarwinds) 침해 사고로 약 18,000개의 조직이 침해되었다.[https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) +* 2019년에 발생한 솔라윈즈(Solarwinds) 침해 사고로 약 18,000개 조직이 침해된 사례. [https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack](https://www.npr.org/2021/04/16/985439655/a-worst-nightmare-cyberattack-the-untold-story-of-the-solarwinds-hack) -**시나리오 2:** 신뢰된 공급업체가 침해되어 특정 조건에서만 악성 행위가 동작하는 사례다. +**시나리오 2:** 신뢰하는 벤더가 침해되어, 특정 조건에서만 악성 행위가 동작하는 경우. -* 2025년에 바이빗(Bybit)은 [월렛 소프트웨어에서의 공급망 공격](https://www.sygnia.co/blog/sygnia-investigation-bybit-hack/)으로15억 달러 가량을 탈취당했다. 해당 악성 코드는 대상 월렛 사용될 때만 실행되었다. +* 2025년에 바이빗(Bybit)은 [월렛 소프트웨어에서의 공급망 공격](https://www.sygnia.co/blog/sygnia-investigation-bybit-hack/)으로 15억 달러가량을 탈취당했다. 해당 공격은 표적 월렛이 사용될 때만 실행되도록 작동했다. -**시나리오 3:** 2025년 발생한 [`Shai-Hulud` 공급망 공격](https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem)은 최초로 성공한 자기 전파형 npm 웜이다. 공격자는 인기 패키지에 악성코드를 주입해 새 버전으로 배포했으며, post-install 스크립트를 통해 민감 정보를 수집하고 퍼블릭 GitHub 레포지터리로 유출했다. 해당 멀웨어는 피해자 환경에서 npm 토큰을 탐지하면 이를 이용해 접근 가능한 모든 패키지에 악성 버전을 자동으로 푸시했다. 이 웜은 npm에 의해 차단되기 전까지 500개 이상의 패키지 버전에 영향을 미쳤다. 이번 공격은 고도화되고 빠르게 전파되어 심각한 피해를 입혔으며, 개발자 환경을 직접 표적으로 삼아 개발자 자신이 공급망 공격의 주요 대상이 될 수 있음을 보여주었다. +**시나리오 3:** 2025년에 발생한 [`Shai-Hulud` 공급망 공격](https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem)은 최초로 성공한 자기복제형 npm 웜이다. 공격자는 인기 패키지에 악성코드를 심어 배포했으며, 이 패키지들은 post-install 스크립트를 통해 민감 정보를 수집하여 공개된 GitHub 저장소로 유출했다. 해당 악성코드는 피해자 환경에서 npm 토큰을 탐지하고, 이를 이용해 접근할 수 있는 모든 패키지에 자동으로 악성 버전을 배포했다. 이 웜은 npm에 의해 차단되기 전까지 500개 이상의 패키지에 확산했다. 이 공급망 공격은 고도화된 공격이며 빠르게 전파되어 심각한 피해를 줬으며, 개발자 환경을 직접 표적으로 삼아 개발자 자신이 공급망 공격의 주요 대상이 될 수 있음을 보여주었다. -**시나리오 4:** 컴포넌트는 일반적으로 애플리케이션과 동일한 권한으로 실행되므로, 컴포넌트의 취약점이 있으면 심각한 영향을 미칠 수 있다. 이러한 취약점은 우발적(예: 코딩 에러)이거나, 의도적(예: 컴포넌트 내 백도어)일 수 있다. 악용 가능한 컴포넌트 취약점 대표적 사례는 다음과 같다. +**시나리오 4:** 컴포넌트는 일반적으로 애플리케이션과 동일한 권한으로 실행되므로, 컴포넌트의 취약점이 있으면 심각한 영향을 미칠 수 있다. 이러한 취약점은 우발적(예: 코딩 에러)이거나, 의도적(예: 컴포넌트 내 백도어)일 수 있다. 지금까지 발결된 악용 가능한 컴포넌트 취약점 사례는 다음과 같다. * CVE-2017-5638: Struts 2의 원격 코드 실행 취약점으로, 서버에서 임의 코드 실행 가능하여 다수의 심각한 침해 사고의 원인이 되었다. -* [CVE-2021-44228](https://github.com/advisories/GHSA-jfh8-c2jp-5v3q "CVE-2021-44228")(Log4Shell): Apache Log4j의 제로데이 원격 코드 실행 취약점으로, 랜섬웨어, 암호화폐 채굴 등 다양한 공격 캠페인에 악용되었다. +* CVE-2021-44228("Log4Shell"): Apache Log4j의 제로데이 원격 코드 실행 취약점으로, 랜섬웨어, 암호화폐 채굴 등 다양한 공격 캠페인에 악용되었다. ## 참조. From 60f176f3e4ca5d4ca366e05bbb1ec126868a36d2 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:01:46 +0900 Subject: [PATCH 123/167] typo --- 2025/docs/ko/A04_2025-Cryptographic_Failures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 197226585..1046db38f 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -57,9 +57,9 @@ ## 설명. -일반적으로, [전송 계층]((https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 에서의 모든 데이터는 암호화되어 전송해야 한다. 과거에는 CPU 성능과 프라이빗 키/인증서 관리가 장벽이었다. 현재는 암호 연산 가속을 위한 CPU 전용 명령어(예: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 가 도입되었고, [LetsEncrypt.org](https://letsencrypt.org/) 같은 서비스와 대형 클라우드 공급업체가 자사 플랫폼에 긴밀히 통합된 인증서 관리 서비스를 제공하면서 프라이빗 키와 인증서 관리도 간소화되었다. +일반적으로, [전송 계층](https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 에서의 모든 데이터는 암호화되어 전송해야 한다. 과거에는 CPU 성능과 프라이빗 키/인증서 관리가 장벽이었다. 현재는 암호 연산 가속을 위한 CPU 전용 명령어(예: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 가 도입되었고, [LetsEncrypt.org](https://letsencrypt.org/) 같은 서비스와 대형 클라우드 공급업체가 자사 플랫폼에 긴밀히 통합된 인증서 관리 서비스를 제공하면서 프라이빗 키와 인증서 관리도 간소화되었다. -전송 계층 보안 외에도 어떤 데이터가 저장 시 암호화가 필요한지, 그리고 전송 중([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer), OSI 7계층)에 추가적인 암호화가 필요한지 결정하는 것이 중요하다. 예를 들어 패스워드, 신용카드 번호, 건강 기록, 개인 정보, 비즈니스 기밀은 추가 보호가 필요하다. 특히 해당 데이터가 개인정보 보호법(예: EU의 GDPR)이나 규정(예: PCI-DSS]의 적용을 받는 경우 더욱 중요하다. +전송 계층 보안 외에도 어떤 데이터가 저장 시 암호화가 필요한지, 그리고 전송 중([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer), OSI 7계층)에 추가적인 암호화가 필요한지 결정하는 것이 중요하다. 예를 들어 패스워드, 신용카드 번호, 건강 기록, 개인 정보, 비즈니스 기밀은 추가 보호가 필요하다. 특히 해당 데이터가 개인정보 보호법(예: EU의 GDPR)이나 규정(예: PCI-DSS)의 적용을 받는 경우 더욱 중요하다. 이러한 모든 데이터에 대해 다음을 확인해야 한다. From c243988be474497944286262fbab3aa44b474150 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:02:46 +0900 Subject: [PATCH 124/167] Add Korean language support to mkdocs configuration --- 2025/mkdocs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/2025/mkdocs.yml b/2025/mkdocs.yml index 32587b5f9..d626f1398 100644 --- a/2025/mkdocs.yml +++ b/2025/mkdocs.yml @@ -100,6 +100,9 @@ extra: - name: en - English link: ./en/ lang: en + - name: ko - Korean + link: ./ko/ + lang: ko # - name: de - Deutsch # link: ./de/ # lang: de From 62667266cc6f48e1e288c47d58e12668a55239cd Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:04:25 +0900 Subject: [PATCH 125/167] Enhance formatting --- 2025/docs/ko/A04_2025-Cryptographic_Failures.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 1046db38f..4630344d8 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -4,7 +4,7 @@ ## 배경. -암호 실패 카테고리는 이전 버전에서 2단계 하락해 4위가 되었다. 이 카테고리는 암호 부재, 불충분한 암호 강도, 암호키 유출 및 관련 오류에 중점을 둔다. 이 위험에서 가장 흔한 CWE 3개는 약한 의사 난수 생성기(PRNG) 사용과 관련이 있다: _CWE-327: 취약하거나 위험한 암호 알고리즘 사용_, _CWE-331: 불충분한 엔트로피_, _CWE-1241: 난수 생성기 내 예측 가능한 알고리즘 사용_, _CWE-338: 암호학적으로 약한 의사 난수 생성기(PRNG) 사용_. +암호 실패 카테고리는 이전 버전에서 2단계 하락해 4위가 되었다. 이 카테고리는 암호 부재, 불충분한 암호 강도, 암호키 유출 및 관련 오류에 중점을 둔다. 이 위험에서 가장 흔한 CWE 3개는 약한 의사 난수 생성기(PRNG) 사용과 관련이 있다: *CWE-327: 취약하거나 위험한 암호 알고리즘 사용*, *CWE-331: 불충분한 엔트로피*, *CWE-1241: 난수 생성기 내 예측 가능한 알고리즘 사용*, *CWE-338: 암호학적으로 약한 의사 난수 생성기(PRNG) 사용*. ## 점수표. @@ -22,9 +22,9 @@ 평균 테스트 커버리지 - 가중 평균 악용도 + 평균 가중 악용도 - 가중 평균 영향도 + 평균 가중 영향도 총 발생 건수 @@ -126,7 +126,7 @@ * [NIST Releases First 3 Finalized Post-Quantum Encryption Standards](https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards) -## List of Mapped CWEs +## 해당되는 CWE 목록. * [CWE-261 Weak Encoding for Password](https://cwe.mitre.org/data/definitions/261.html) From dbd27f20379c08cf0944bb5f99ca798b3a043931 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:05:32 +0900 Subject: [PATCH 126/167] Update titles to standardize terminology --- 2025/docs/ko/A01_2025-Broken_Access_Control.md | 4 ++-- 2025/docs/ko/A02_2025-Security_Misconfiguration.md | 6 +++--- 2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md | 4 ++-- 2025/docs/ko/A04_2025-Cryptographic_Failures.md | 4 ++-- 2025/docs/ko/A05_2025-Injection.md | 4 ++-- 2025/docs/ko/A06_2025-Insecure_Design.md | 4 ++-- 2025/docs/ko/A07_2025-Authentication_Failures.md | 4 ++-- .../ko/A09_2025-Security_Logging_and_Alerting_Failures.md | 4 ++-- .../ko/A10_2025-Mishandling_of_Exceptional_Conditions.md | 4 ++-- 2025/docs/ko/X01_2025-Next_Steps.md | 8 ++++---- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md index ffacd27bf..93ca3f0d6 100644 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -13,9 +13,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index 82678f0e5..fd3215935 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -3,7 +3,7 @@ ## 배경. -지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트된 모든 애플리케이션에서 잘못된 설정 중 한가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 취약점 발생률은 3% 이며, 총 CWE는 1,375개이고 71만 9천개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 `CWE-16: 설정` 그리고 `CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)`가 있다. +지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트된 모든 애플리케이션에서 잘못된 설정 중 한가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3% 이며, 총 CWE는 1,375개이고 71만 9천개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 `CWE-16: 설정` 그리고 `CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)`가 있다. ## 점수표. @@ -13,9 +13,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index 74e1a10ec..9296f6aa9 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -12,9 +12,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 4630344d8..c945e3cb4 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -14,9 +14,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index a8b73887e..b31933903 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -11,9 +11,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index fbe4d4d2b..bb210bfe5 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -14,9 +14,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index f27b62003..14e20e32e 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -13,9 +13,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index bbf75d05c..1c5a2ea70 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -13,9 +13,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index 51373f6b7..ae69be6ad 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -18,9 +18,9 @@ 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index 84964709c..9b11631bd 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -19,9 +19,9 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 @@ -163,9 +163,9 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 해당되는 CWE 개수 - 최대 취약점 발생률 + 최대 발생률 - 평균 취약점 발생률 + 평균 발생률 최대 테스트 커버리지 From b093b39a3715c1ce2bcff29256130da9c2abdf63 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:08:02 +0900 Subject: [PATCH 127/167] typo --- 2025/docs/ko/0x00_2025-Introduction.md | 2 +- 2025/mkdocs.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 1553dddcc..7ce2175b9 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -12,7 +12,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! -* [A01:2025 - 충분한 접근 제어](A01_2025-Broken_Access_Control.md) +* [A01:2025 - 불충분한 접근 제어](A01_2025-Broken_Access_Control.md) * [A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md) * [A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md) * [A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md) diff --git a/2025/mkdocs.yml b/2025/mkdocs.yml index d626f1398..ac11dcf61 100644 --- a/2025/mkdocs.yml +++ b/2025/mkdocs.yml @@ -58,10 +58,10 @@ plugins: What are Application Security Risks?: 애플리케이션 보안 위험이란 무엇인가? Establishing a Modern Application Security Program: 현대적 애플리케이션 보안 체계를 수립하는 법 Top 10:2025 List: OWASP Top 10:2025 목록 - A01 Broken Access Control: A01 충분한 접근 제어 + A01 Broken Access Control: A01 불충분한 접근 제어 A02 Security Misconfiguration: A02 보안 설정 오류 A03 Software Supply Chain Failures: A03 소프트웨어 공급망 실패 - A04 Cryptographic Failures: A04 암호 체계 실패 + A04 Cryptographic Failures: A04 암호 실패 A05 Injection: A05 인젝션 A06 Insecure Design: A06 안전하지 않은 설계 A07 Authentication Failures: A07 인증 실패 From 59da969f19fcae9c04edd88640acbcea1adee632 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:09:46 +0900 Subject: [PATCH 128/167] Update image path --- 2025/docs/ko/0x00_2025-Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 7ce2175b9..8b8d3797b 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -28,7 +28,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! 2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. -![Mapping](./assets/Top10Mapping-ko.PNG) +![Mapping](../assets/Top10Mapping-ko.PNG) * **[A01:2025 - 불충분한 접근 제어](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. * **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. From dedf872bf269b70d3bace6ad9e17bef8eb6c3273 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:11:47 +0900 Subject: [PATCH 129/167] Enhance formatting of CWE --- 2025/docs/ko/A02_2025-Security_Misconfiguration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index fd3215935..b7c41548d 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -3,7 +3,7 @@ ## 배경. -지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트된 모든 애플리케이션에서 잘못된 설정 중 한가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3% 이며, 총 CWE는 1,375개이고 71만 9천개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 `CWE-16: 설정` 그리고 `CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)`가 있다. +지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트된 모든 애플리케이션에서 잘못된 설정 중 한가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3% 이며, 총 CWE는 1,375개이고 71만 9천개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 *CWE-16: 설정* 그리고 *CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)*가 있다. ## 점수표. From 0ed77e4439e7521e60644d7dd986b2231b29fde1 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:15:58 +0900 Subject: [PATCH 130/167] Refine Korean translation for clarity and consistency --- .../ko/A02_2025-Security_Misconfiguration.md | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index b7c41548d..7378dd3a9 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -3,7 +3,7 @@ ## 배경. -지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트된 모든 애플리케이션에서 잘못된 설정 중 한가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3% 이며, 총 CWE는 1,375개이고 71만 9천개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할만한 CWE로는 *CWE-16: 설정* 그리고 *CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)*가 있다. +지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트 된 모든 애플리케이션에서 잘못된 설정 중 한 가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3%이며, 총 CWE는 1,375개이고 71만 9천 개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할 만한 CWE로는 *CWE-16: 설정* 그리고 *CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)*가 있다. ## 점수표. @@ -56,19 +56,19 @@ ## 설명. -보안 설정 오류은 보안 관점에서 시스템, 애플리케이션, 클라우드 서비스 설정이 잘못되어 취약점이 발생하는 것을 말한다. +보안 설정 오류는 보안 관점에서 시스템, 애플리케이션, 클라우드 서비스 설정이 잘못되어 취약점이 발생하는 것을 말한다. 다음과 같은 경우 애플리케이션은 취약할 수 있다. -* 애플리케이션 스택 전반에 적절한 보안 하드닝이 적용되지 않았거니, 클라우드 서비스 내 보안 설정이 잘못 구성되어 있는 경우. -* 불필요한 기능이 활성화 또는 설치된 경우. (예: 불필요 포트, 서비스, 페이지, 계정, 테스트 프레임워크 또는 권한) -* 기본 계정, 패스워드가 활성화되어 있거나 변경되지 않은 경우 -* 과도한 에러메시지를 처리할 공통 설정이 부족하여 에러 처리 과정에서 스택 트레이스(stack trace)나 과도한 에러 정보 메시지가 사용자에게 전달되는 경우. -* 업그레이드된 시스템에서 최신 보안 기능이 비활성화 되어 있거나 안전하게 설정되지 않은 경우. +* 애플리케이션 스택 전반에 적절한 보안 하드닝이 적용되지 않았거니, 클라우드 서비스 내 보안 설정이 잘못 구성된 경우. +* 불필요한 기능(예: 불필요 포트, 서비스, 페이지, 계정, 테스트 프레임워크 또는 권한)이 활성화 또는 설치된 경우. +* 기본 계정, 패스워드가 활성화되어 있거나 변경되지 않은 경우. +* 과도한 에러 메시지를 처리할 공통 설정이 부족하여 에러 처리 과정에서 스택 트레이스(stack trace)나 과도한 에러 정보 메시지가 사용자에게 전달되는 경우. +* 업그레이드된 시스템에서 최신 보안 기능이 비활성화되어 있거나 안전하게 설정되지 않은 경우. * 이전 버전과의 호환성을 우선시하여 안전하지 않은 설정을 하는 경우. * 애플리케이션 서버 내 보안 설정, 애플리케이션 프레임워크(예: 스트럿츠(Struts), 스프링(Spring), ASP.NET), 라이브러리, 데이터베이스 등에서 보안 설정이 되지 않은 경우. -* 서버가 보안 헤더 또는 지시문을 전달하지 않거나 안전하지 않은 설정 값으로 전달되는 경우. +* 서버가 보안 헤더 또는 지시문을 전달하지 않거나 안전하지 않은 설정값으로 전달되는 경우. 일관되고 재사용 가능한 애플리케이션 보안 설정 하드닝 절차가 없다면 시스템은 더 높은 위험에 놓인다. @@ -77,28 +77,27 @@ 다음과 같은 항목들을 포함하여 보안성이 반영된 구성 절차를 수립한다. -* 재사용 가능한 하드닝 프로세스를 구축하여 필요한 보안 통제가 적용된 동일한 형태의 신규 환경을 빠르고 쉽게 배포 가능해야 한다. 개발, QA, 운영 환경은 모두 동일한 구성으로 설정하며, 각각의 환경에서 서로 다른 자격증명을 사용한다. 이 프로세스는 자동화하여 요구되는 새로운 보안환경을 구성하는 데 필요한 노력을 최소화한다. +* 재사용할 수 있는 하드닝 프로세스를 구축하여 필요한 보안 통제가 적용된 동일한 형태의 신규 환경을 빠르고 쉽게 배포할 수 있어야 한다. 개발, QA, 운영 환경은 모두 동일한 구성으로 설정하며, 각각의 환경에서 서로 다른 자격 증명을 사용한다. 이 프로세스는 자동화하여 요구되는 새로운 보안 환경을 구성하는 데 필요한 노력을 최소화한다. * 사용하지 않은 기능, 컴포넌트, 문서, 샘플을 포함하지 않는 최소한의 플랫폼을 구현한다. 사용하지 않는 기능과 프레임워크는 삭제하거나 설치되지 않아야 한다. * 패치 관리 프로세스(참고: [A03 소프트웨어 공급망 체인 실패](A03_2025-Software_Supply_Chain_Failures.md)) 수행 시 모든 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트를 한다. 또한, 클라우드 스토리지 권한(예: S3 버킷 권한)을 점검한다. -* 구성 요소 간 또는 테넌트 간 효과적으로 격리할 수 있도록 세분화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 애플리케이션 아키텍쳐를 설계함으로써 효과적이고 안전한 분리 구조를 보장한다. +* 구성 요소 간 또는 테넌트 간 효과적으로 격리할 수 있도록 세분화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 애플리케이션 아키텍처를 설계함으로써 효과적이고 안전한 분리 구조를 보장한다. * 보안 지시문을 클라이언트로 보내야 한다. (예: 보안 헤더) * 자동화된 프로세스를 구축하여 모든 환경에서 해당 설정들의 안전성을 검증한다. * 만일의 경우를 대비해, 과도한 에러 메시지가 사용자에게 노출되지 않도록 공통 설정을 사전에 구성한다. -* 만약 이런 검증사항들이 자동화되지 않았다면, 최소한 매년 1회는 수동으로 검증한다. -* 코드, 설정 파일, 파이프 라인 내 정적인 키나 시크릿을 저장하는 대신 플랫폼에서 제공하는 아이덴티티 페더레이션, 단기 유효 자격 증명, 또는 역할 기반 접근 매커니즘을 사용한다. +* 만약 이런 검증 사항들이 자동화되지 않았다면, 최소한 매년 1회는 수동으로 검증한다. +* 코드, 설정 파일, 파이프라인 내 정적인 키나 시크릿을 저장하는 대신 플랫폼에서 제공하는 아이덴티티 페더레이션, 단기 유효 자격 증명, 또는 역할 기반 접근 메커니즘을 사용한다. ## 공격 시나리오 예시. -**시나리오 1:** 운영 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재한다고 알려져 있으며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인 한 뒤 시스템 장악이 가능하다. +**시나리오 1:** 운영 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재한다고 알려져 있으며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인한 뒤 시스템 장악이 가능하다. -**시나리오 2:** 서버에서 디렉토리 리스팅이 활성화 되었을 때 공격자는 단순하게 디렉토리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드 할 수 있고, 이런 클래스들을 디컴파일 하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. +**시나리오 2:** 서버에서 디렉터리 리스팅이 활성화되었을 때 공격자는 단순하게 디렉터리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드 할 수 있고, 이런 클래스들을 디컴파일 하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. -**시나리오 3:** 사용자에게 반환되는 스택 트레이스 같은 자세한 에러 메시지가 표시되도록 설정되어 있는 경우 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. +**시나리오 3:** 사용자에게 반환되는 스택 트레이스 같은 자세한 에러 메시지가 표시되도록 설정되면 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. **시나리오 4:** 클라우드 서비스 제공자(Cloud service provider, CSP)는 인터넷에 자원을 공유하는 권한이 기본 설정이다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. - ## 참조. * [OWASP Testing Guide: Configuration Management](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/README) From c063968b9443ae92a87d1192293c2d587c0909cb Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:19:19 +0900 Subject: [PATCH 131/167] Update Korean word for consistency --- ...tablishing_a_Modern_Application_Security_Program.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 865cd56ec..184f638e6 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -233,7 +233,7 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 코딩 표준 - 기본적인 + 최소한 예 @@ -241,7 +241,7 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 보안 코드 리뷰 - 기본적인 + 최소한 예 @@ -249,7 +249,7 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 피어 리뷰(peer review) 체크리스트 - 기본적인 + 최소한 예 @@ -273,7 +273,7 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 침투 테스트 - 기본적인 + 최소한 예 @@ -281,7 +281,7 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리 도구 지원 - 기본적인 + 최소한 예 From b412fbc8e8f148a661a3cda5c241863e9dcfc15b Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:21:38 +0900 Subject: [PATCH 132/167] Remove duplicated section --- .../docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index ae69be6ad..25c8c7d00 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -2,10 +2,6 @@ ## 배경. -부적절한 예외 처리는 2025년에 신설된 카테고리다. 이 카테고리는 24개의 CWE를 포함하며, 부적절한 오류 처리, 논리적 오류, 안전하지 않은 실패(Failing Open), 그 외 시스템이 비정상적인 상황에서 마주할 수 있는 시나리오를 다룬다. 이 카테고리에는 이전에 "코드 품질 저하"와 연관되었던 일부 CWE가 포함되어 있다. 기존 분류는 너무 광범위했으며, 이처럼 구체적인 카테고리가 더 명확한 가이드를 제공한다고 판단했다. - -## 배경. - 부적절한 예외 처리는 2025년에 신설된 카테고리다. 이 카테고리는 24개의 CWE를 포함하며, 부적절한 오류 처리, 논리적 오류, 페일 오픈(fail open), 그 외 시스템이 비정상적인 상황에서 마주할 수 있는 시나리오를 다룬다. 이 카테고리에는 이전에 낮은 코드 품질과 연관되었던 일부 CWE가 포함되어 있다. 기존의 낮은 코드 품질 카테고리는 너무 광범위했기에, 부적절한 예외 처리라는 구체적인 카테고리로 분리하여 더 명확한 가이드를 제공하고자 했다. 대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족에 대한 부적절한 처리*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 취약한 실패 처리('Failing Open')*가 있다. From 0e8c0fe304d147fbdef118078da063ab7c2acf47 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:22:57 +0900 Subject: [PATCH 133/167] typo --- .../docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index 25c8c7d00..ded875dfa 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -61,7 +61,7 @@ 예외 상황은 다음과 같은 원인으로 발생할 수 있다. 누락되거나 불완전한 입력 검증, 발생 지점이 아닌 상위 레벨에서의 지연된 오류 처리, 메모리,권한,네트워크 문제 등 예기치 않은 환경 상태, 일관성 없는 예외 처리, 또는 전혀 처리되지 않는 예외로 인해 시스템이 알 수 없고 예측 불가능한 상태에 빠지는 경우다. 애플리케이션이 다음에 무엇을 해야 할지 알 수 없는 상태에 빠진다면, 예외 처리가 실패한 것이다. 이러한 오류와 예외는 발견이 어려워 장기간 보안을 위협할 수 있다. -부적절한 예외 처리로 인해 다양한 보안 취약점이 발생할 수 있다. 예를 들어 논리 버그, 오버플로우, 레이스 컨디션, 부정 거래, 메모리,상태,리소스,타이밍,인증,인가 관련 문제 등이 있다. 이러한 유형의 취약점은 시스템 또는 데이터의 기밀성, 가용성, 무결성에 부정적인 영향을 미칠 수 있다. 공격자는 애플리케이션의 결함 있는 오류 처리를 악용하여 이 취약점을 공격한다. +부적절한 예외 처리로 인해 다양한 보안 취약점이 발생할 수 있다. 예를 들어 논리 버그, 오버플로우, 레이스 컨디션, 부정 거래, 메모리, 상태, 리소스, 타이밍, 인증, 인가 관련 문제 등이 있다. 이러한 유형의 취약점은 시스템 또는 데이터의 기밀성, 가용성, 무결성에 부정적인 영향을 미칠 수 있다. 공격자는 애플리케이션의 결함 있는 오류 처리를 악용하여 이 취약점을 공격한다. ## 대응 방안. @@ -73,7 +73,7 @@ 특정 빈도 이상으로 동일한 오류가 반복될 경우, 개별 오류 메시지 대신 발생 횟수와 시간대를 보여주는 통계 형태로 출력하는 것을 고려하라. 이 정보는 자동화된 로깅 및 모니터링을 방해하지 않도록 원본 메시지에 추가하는 방식으로 처리해야 한다. [A09:2025 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)를 참고하라. -이 외에도 다음 사항을 포함해야 한다. 엄격한 입력 검증(허용해야 하는 위험 문자에 대한 새니타이징 또는 이스케이프 처리 포함), *중앙 집중화된* 오류 처리,로깅,모니터링,알림 체계, 그리고 전역 예외 핸들러다. 하나의 애플리케이션에서 예외 처리를 위한 여러 함수를 두어서는 안 되며, 한 곳에서 동일한 방식으로 처리해야 한다. 또한 이 섹션의 모든 권고 사항에 대해 프로젝트 보안 요구사항을 수립하고, 설계 단계에서 위협 모델링 또는 보안 설계 검토를 수행하며, 코드 리뷰나 정적 분석을 실시하고, 최종 시스템에 대해 스트레스,성능,침투 테스트를 수행해야 한다. +이 외에도 다음 사항을 포함해야 한다. 엄격한 입력 검증(허용해야 하는 위험 문자에 대한 새니타이징 또는 이스케이프 처리 포함), *중앙 집중화된* 오류 처리,로깅,모니터링,알림 체계, 그리고 전역 예외 핸들러다. 하나의 애플리케이션에서 예외 처리를 위한 여러 함수를 두어서는 안 되며, 한 곳에서 동일한 방식으로 처리해야 한다. 또한 이 섹션의 모든 권고 사항에 대해 프로젝트 보안 요구사항을 수립하고, 설계 단계에서 위협 모델링 또는 보안 설계 검토를 수행하며, 코드 리뷰나 정적 분석을 실시하고, 최종 시스템에 대해 스트레스, 성능, 침투 테스트를 수행해야 한다. 가능하다면 조직 전체가 동일한 방식으로 예외 상황을 처리하는 것이 좋다. 이렇게 하면 이 중요한 보안 통제에 대한 코드 리뷰와 감사가 더 쉬워진다. From b3de1ca18ce38f07171e72e39a939027ec796267 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:29:09 +0900 Subject: [PATCH 134/167] Add clarification on the translation of cryptographic --- 2025/docs/ko/A04_2025-Cryptographic_Failures.md | 1 + 1 file changed, 1 insertion(+) diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index c945e3cb4..e888eaa83 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -1,5 +1,6 @@ # A04:2025 암호 실패 ![icon](../assets/TOP_10_Icons_Final_Crypto_Failures.png){: style="height:80px;width:80px" align="right"} +> 옮긴이: 본 문서에서는 "cryptographic"을 "암호"로 번역한다. 이는 종종 "암호화"로 번역되나, 해당 용어는 암호화뿐 아니라 복호화, 해시, 전자서명 등 암호 기술 전반을 포괄하므로 본 문서의 번역어를 "암호"로 통일한다. ## 배경. From b02ef41cf64a322a3f6ea93df1a2c7c79b2af41f Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:32:10 +0900 Subject: [PATCH 135/167] typo --- ...3_2025-Establishing_a_Modern_Application_Security_Program.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index 184f638e6..f401b74ef 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -194,7 +194,7 @@ OWASP Top 10은 주로 인식 제고 문서이다. 그러나 이는 2003년 처 OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리케이션 보안 위험을 문서화한 것이며, 쉽게 테스트 가능한 위험을 다루는 것은 아니라는 점이다. 예를 들어 [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)는 대부분의 테스트 방식으로는 검증하기가 어렵다. 또 다른 예로, 로깅 및 모니터링이 실제로 적용되어 있고, 사용 중이며, 효과적으로 동작하는지 여부를 테스트하는 것은 인터뷰와 사고 대응 사례를 샘플링하는 방식으로만 가능하다. 정적 코드 분석 도구는 로깅 부재를 탐지할 수 있으나, 비즈니스 로직 또는 접근 통제가 위험한 보안 사고를 로깅하는지 여부를 판단하는 것은 불가능할 수 있다. 침투 테스트 역시 테스트 환경에서의 탐지/대응 확인에 그칠 수 있으며, 테스트 환경은 운영 환경과 동일한 수준이 아닌 경우가 많다. -아래는 OWASP Top 10을 표준으로 활용하기에 적절한 상황에 대한 권고사항이다: +아래의 표는 OWASP Top 10을 표준으로 활용하기에 적절한 상황에 대한 권고사항이다. From eefbca39bf030f8c981352ebe1c420e846a7270d Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:32:54 +0900 Subject: [PATCH 136/167] typo --- 2025/docs/ko/A06_2025-Insecure_Design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index bb210bfe5..54616d5af 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -78,7 +78,7 @@ ### 보안 개발 생명주기 -안전한 소프트웨어에는 보안 개발 생명주기, 안전한 설계 패턴, 포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것) 방법론, 안전한 컴포넌트 라이브러리, 적절한 도구, 위협 모델링, 그리고 프로세스를 개선하기 위해 사용되는 사고 포스트모템(post-mortem)이 필요하다. 소프트웨어 프로젝트 초기부터 보안 전문가와 협업하고, 개발 전체 과정 및 소프트웨어 유지보수 단계에서도 지속적으로 협업해야 한다. 보안 개발 활동을 체계화하기 위해 [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM](https://owaspsamm.org/)와 같은 성숙도 모델을 참고하는 방안을 고려하라. +안전한 소프트웨어에는 보안 개발 생명주기, 안전한 설계 패턴, 포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것) 방법론, 안전한 컴포넌트 라이브러리, 적절한 도구, 위협 모델링, 그리고 프로세스를 개선하기 위해 사용되는 사고 포스트모템(post-mortem)이 필요하다. 소프트웨어 프로젝트 초기부터 보안 전문가와 협업하고, 개발 전체 과정 및 소프트웨어 유지보수 단계에서도 지속적으로 협업해야 한다. 보안 개발 활동을 체계화하기 위해 [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owaspsamm.org/)와 같은 성숙도 모델을 참고하는 방안을 고려하라. 개발자가 보안에 대해 주도적으로 책임져야 한다는 인식이 종종 부족하다. 보안 인식과 책임감을 강화하고, 위험을 사전에 완화하려는 문화를 조성하라. 보안에 관한 정기적인 교류(예: 위협 모델링 세션 도중)는 모든 중요한 설계 의사결정에 보안을 포함시키기 위한 마인드셋을 형성할 수 있다. From 52a1df69910b54da953e052c8373a7e4000cd9e4 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:36:59 +0900 Subject: [PATCH 137/167] Update word for clarity --- 2025/docs/ko/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index d382d1e24..fc46ecf18 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -2,7 +2,7 @@ OWASP Top 10:2025 버전에 오신 것을 환영합니다. -OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제고용 자료이며, 웹 애플리케이션의 가장 중대한 보안 위험에 대한 업계의 폭넓은 합의를 반영한다. +OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제고용 자료이며, 웹 애플리케이션의 가장 중대한 보안 위험에 대한 업계의 공감대를 반영한다. ## 이번 버전 소개 From 281ff495a16480a2921802907ec31b5ba02a3b52 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 03:39:39 +0900 Subject: [PATCH 138/167] typo --- 2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index 9296f6aa9..a00027a8f 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -3,7 +3,7 @@ ## 배경. -소프트웨어 공급망 실패는 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정하였다. 2013년 TOP 10에 "A9 - 사용 중인 컴포넌트 내 알려진 취약점" 으로 처음 등장한 이후, 해당 카테고리는 "알려진 취약점" 외에도 "모든 공급망 실패"를 포함하도록 범위가 확장되었다. 범위가 확대됨에도 불구하고, 공급망 실패는 여전히 식별이 어려우며, 관련 CWE와 매핑된 CVE가 11개에 불과하다. 그러나, 수집한 데이터를 테스트하고 보고한 결과에 따르면 이번 카테고리는 5.19%라는 높은 평균 사고 발생률을 보였고, 관련된 CWE로는 *CWE-477: 더 이상 사용되지 않는 기능 사용*, *CWE-1104: 관리되지 않은 외부 컴포넌트 사용*, *CWE-1329: 업데이트할 수 없는 컴포넌트에 대한 의존*, 그리고 *CWE-1395: 취약한 외부 컴포넌트 의존* 이 있다. +소프트웨어 공급망 실패는 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정하였다. 2013년 TOP 10에 "A9 - 사용 중인 컴포넌트 내 알려진 취약점" 으로 처음 등장한 이후, 해당 카테고리는 "알려진 취약점" 외에도 "모든 공급망 실패"를 포함하도록 범위가 확장되었다. 범위가 확대됨에도 불구하고, 공급망 실패는 여전히 식별이 어려우며, 관련 CWE와 매핑된 CVE가 11개에 불과하다. 그러나, 수집한 데이터를 테스트하고 보고한 결과에 따르면 이번 카테고리는 5.19%라는 가장 높은 평균 발생률을 보였고, 관련된 CWE로는 *CWE-477: 더 이상 사용되지 않는 기능 사용*, *CWE-1104: 관리되지 않은 외부 컴포넌트 사용*, *CWE-1329: 업데이트할 수 없는 컴포넌트에 대한 의존*, 그리고 *CWE-1395: 취약한 외부 컴포넌트 의존* 이 있다. ## 점수표. From 671ae137d9d40fcf598c0217facd35c4c4abbf25 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 13:23:18 +0900 Subject: [PATCH 139/167] Change imperative sentences to declarative sentences --- 2025/docs/ko/A06_2025-Insecure_Design.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 54616d5af..290e4c130 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -86,16 +86,16 @@ ## 대응 방안. -* 보안 및 프라이버시 관련 통제를 평가하고 설계하는 데 도움받기 위해 애플리케이션 보안 전문가와 함께 안전한 개발 생명주기(SDLC)를 수립하고 운영하라. +* 보안 및 프라이버시 관련 통제를 평가하고 설계하는 데 도움받기 위해 애플리케이션 보안 전문가와 함께 안전한 개발 생명주기(SDLC)를 수립하고 운영한다. * 안전한 설계 패턴과 포장된 도로 컴포넌트를 라이브러리화하여 사용한다. * 인증, 접근 제어, 비즈니스 로직, 핵심 처리 흐름과 같은 애플리케이션의 중요한 부분을 위협 모델링한다. -* 보안 마인드셋을 생성하기 위한 교육 도구로서 위협 모델링을 사용하라. -* 유저 스토리에 보안 요구사항과 보안 통제를 반영하라. +* 보안 마인드셋을 생성하기 위한 교육 도구로서 위협 모델링을 사용한다. +* 유저 스토리에 보안 요구사항과 보안 통제를 반영한다. * 애플리케이션의 각 계층(프론트엔드부터 백엔드까지)에 요청과 데이터가 타당한지 검증하는 절차를 추가한다. * 위협 모델에 기반해 핵심 흐름이 안전한지 검증하는 단위 및 통합 테스트를 구현하고, 애플리케이션 계층별 정상 시나리오*와* 악용 시나리오를 취합한다. * 외부 노출 수준과 보호 필요도에 따라 시스템 및 네트워크 레벨에서 분리한다. * 전 계층에 걸쳐 설계 단계부터 테넌트 격리(tenant isolation)를 강하게 보장한다. -* 전 계층에서 테넌트를 구조적으로 격리되도록 하라. +* 전 계층에서 테넌트를 구조적으로 격리되도록 한다. ## 공격 시나리오 예시. From 93921870a90db03c8e9784e97e9a182bf0ab1802 Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Thu, 8 Jan 2026 14:09:11 +0900 Subject: [PATCH 140/167] Modify A02_2025-Security_Misconfiguration.md typos --- 2025/docs/ko/A02_2025-Security_Misconfiguration.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index 7378dd3a9..2c8c598cb 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -61,7 +61,7 @@ 다음과 같은 경우 애플리케이션은 취약할 수 있다. -* 애플리케이션 스택 전반에 적절한 보안 하드닝이 적용되지 않았거니, 클라우드 서비스 내 보안 설정이 잘못 구성된 경우. +* 애플리케이션 스택 전반에 적절한 보안 하드닝이 적용되지 않았거나, 클라우드 서비스 내 보안 설정이 잘못 구성된 경우. * 불필요한 기능(예: 불필요 포트, 서비스, 페이지, 계정, 테스트 프레임워크 또는 권한)이 활성화 또는 설치된 경우. * 기본 계정, 패스워드가 활성화되어 있거나 변경되지 않은 경우. * 과도한 에러 메시지를 처리할 공통 설정이 부족하여 에러 처리 과정에서 스택 트레이스(stack trace)나 과도한 에러 정보 메시지가 사용자에게 전달되는 경우. @@ -80,7 +80,7 @@ * 재사용할 수 있는 하드닝 프로세스를 구축하여 필요한 보안 통제가 적용된 동일한 형태의 신규 환경을 빠르고 쉽게 배포할 수 있어야 한다. 개발, QA, 운영 환경은 모두 동일한 구성으로 설정하며, 각각의 환경에서 서로 다른 자격 증명을 사용한다. 이 프로세스는 자동화하여 요구되는 새로운 보안 환경을 구성하는 데 필요한 노력을 최소화한다. * 사용하지 않은 기능, 컴포넌트, 문서, 샘플을 포함하지 않는 최소한의 플랫폼을 구현한다. 사용하지 않는 기능과 프레임워크는 삭제하거나 설치되지 않아야 한다. * 패치 관리 프로세스(참고: [A03 소프트웨어 공급망 체인 실패](A03_2025-Software_Supply_Chain_Failures.md)) 수행 시 모든 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트를 한다. 또한, 클라우드 스토리지 권한(예: S3 버킷 권한)을 점검한다. -* 구성 요소 간 또는 테넌트 간 효과적으로 격리할 수 있도록 세분화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 애플리케이션 아키텍처를 설계함으로써 효과적이고 안전한 분리 구조를 보장한다. +* 구성 요소 간 또는 테넌트 간을 효과적으로 격리할 수 있도록 세분화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 애플리케이션 아키텍처를 설계함으로써 효과적이고 안전한 분리 구조를 보장한다. * 보안 지시문을 클라이언트로 보내야 한다. (예: 보안 헤더) * 자동화된 프로세스를 구축하여 모든 환경에서 해당 설정들의 안전성을 검증한다. * 만일의 경우를 대비해, 과도한 에러 메시지가 사용자에게 노출되지 않도록 공통 설정을 사전에 구성한다. @@ -92,11 +92,11 @@ **시나리오 1:** 운영 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재한다고 알려져 있으며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인한 뒤 시스템 장악이 가능하다. -**시나리오 2:** 서버에서 디렉터리 리스팅이 활성화되었을 때 공격자는 단순하게 디렉터리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드 할 수 있고, 이런 클래스들을 디컴파일 하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. +**시나리오 2:** 서버에서 디렉터리 리스팅이 활성화되었을 때 공격자는 단순하게 디렉터리 목록을 탐색할 수 있다. 공격자는 컴파일된 자바 클래스들을 찾거나 다운로드할 수 있고, 이런 클래스들을 디컴파일하거나 리버싱 엔지니어링을 통해 코드를 볼 수 있다. 그 뒤 공격자는 애플리케이션 내에서 서버 접근 제어 취약점을 찾은 뒤 악용 가능하다. **시나리오 3:** 사용자에게 반환되는 스택 트레이스 같은 자세한 에러 메시지가 표시되도록 설정되면 민감한 정보나 해당 컴포넌트 버전에 알려진 취약점 같은 근본적 취약점이 노출될 가능성이 있다. -**시나리오 4:** 클라우드 서비스 제공자(Cloud service provider, CSP)는 인터넷에 자원을 공유하는 권한이 기본 설정이다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. +**시나리오 4:** 클라우드 서비스 제공자(Cloud service provider, CSP)는 인터넷에 자원을 공유하는 권한이 기본 설정이다. 이는 민감한 정보가 공개된 클라우드 스토리지 내에 저장될 시 관계자 외 접근을 허용할 수 있다. ## 참조. From e5b0c74974bb6e84a97b9f33f99549245726ae61 Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Thu, 8 Jan 2026 14:19:06 +0900 Subject: [PATCH 141/167] Modify A03_2025-Software_Supply_Chain_Failures.md typos --- 2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index a00027a8f..bea826011 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -153,7 +153,7 @@ ## 해당되는 CWE. -* [CWE-447 Use of Obsolete Function](https://cwe.mitre.org/data/definitions/447.html) +* [CWE-477 Use of Obsolete Function](https://cwe.mitre.org/data/definitions/477.html) * [CWE-1035 2017 Top 10 A9: Using Components with Known Vulnerabilities](https://cwe.mitre.org/data/definitions/1035.html) From 83d43e04bb5ce7ba17ff1db6165c41b339942be8 Mon Sep 17 00:00:00 2001 From: Juhyeong Kim Date: Thu, 8 Jan 2026 14:31:21 +0900 Subject: [PATCH 142/167] Modify A03_2025-Software_Supply_Chain_Failures.md typos --- .../ko/A03_2025-Software_Supply_Chain_Failures.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index a00027a8f..c1b7de882 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -62,9 +62,9 @@ * 사용하는 모든 컴포넌트(클라이언트 사이드, 서버 사이드 모두) 버전을 추적하지 않는 경우. 여기에서 컴포넌트는 직접 사용하는 컴포넌트뿐만 아니라 중첩 (전이) 의존성도 포함한다. * 소프트웨어가 취약하거나, 더 이상 지원하지 않거나, 오래된 버전인 경우. 이는 OS, 웹/애플리케이션 서버, 데이터베이스 관리 시스템(DBMS), 애플리케이션, API, 모든 컴포넌트, 런타임 환경 그리고 모든 라이브러리를 포함한다. * 사용 중인 컴포넌트에 대해 주기적으로 취약점을 스캔하지 않거나 보안 공지를 구독하지 않는 경우. -* 공급망의 변경을 관리하는 절차가 없거나, 변경 이력을 추적하지 못하는 경우. 여기에는 사용 중인 IDE와 IDE 확장 프로그램(extension) 및 업데이트를 추적하는 것, 조직의 코드 저장소에서 발생하는 변경 사항, 샌드박스, 이미지 및 라이브러리 저장소, 아티팩트가 생성되고 보관되는 방식 등도 모두 포함됩니다. 공급망을 이루는 모든 요소는 문서화되어야 하며, 특히 변경 사항은 반드시 기록으로 남겨야 합니다. +* 공급망의 변경을 관리하는 절차가 없거나, 변경 이력을 추적하지 못하는 경우. 여기에는 사용 중인 IDE와 IDE 확장 프로그램(extension) 및 업데이트를 추적하는 것, 조직의 코드 저장소에서 발생하는 변경 사항, 샌드박스, 이미지 및 라이브러리 저장소, 아티팩트가 생성되고 보관되는 방식 등도 모두 포함된다. 공급망을 이루는 모든 요소는 문서화되어야 하며, 특히 변경 사항은 반드시 기록으로 남겨야 한다. * 공급망에 대한 모든 영역에 보안 하드닝이 없는 경우. 특히 접근 제어 부분과 애플리케이션 최소 권한 원칙 적용을 신경 쓰지 않은 경우. -* 공급망 시스템에 직무 분리가 없는 경우. 다른 사람의 검토와 승인 없이 작성된 코드를 운영 환경에 배포하면 안 된다. +* 공급망 시스템에 직무 분리가 없는 경우. 다른 사람의 검토와 승인 없이 작성된 코드를 운영 환경에 배포해서는 안 된다. * 기술 스택의 어느 계층에서든 신뢰할 수 없는 출처의 컴포넌트가 사용되고 있거나, 이에 따라 운영 환경이 영향받는 경우. * 기반이 되는 플랫폼, 프레임워크, 의존성을 위험도에 따라 또는 적시에 수정하거나 업그레이드하지 않는 경우. 이는 보통 변경 관리 절차 때문에 패치를 매월, 매 분기 단위로 작업할 때 흔히 발생하며, 취약점 조치 전까지 조직에 불필요한 위험을 수일 또는 수개월간 노출할 수 있다. * 소프트웨어 개발자가 업데이트, 업그레이드, 패치된 라이브러리의 호환성을 테스트하지 않는 경우. @@ -79,14 +79,14 @@ * 전체 소프트웨어에 대한 소프트웨어 자재 명세서(Software Bill of Materials, SBOM)를 중앙에서 생성 및 관리한다. * 직접 추가한 의존성만 추적할 것이 아니라, 그 의존성의 (전이) 의존성, 그리고 그다음 단계 의존성까지 추적한다. -* 사용하지 않는 의존성, 불필요하지 않은 기능, 컴포넌트, 파일 그리고 문서를 지움으로써 공격 표면을 축소한다. +* 사용하지 않는 의존성, 불필요한 기능, 컴포넌트, 파일 그리고 문서를 지움으로써 공격 표면을 축소한다. * OWASP Dependency Track, OWASP Dependency Check, retire.js 등과 같은 도구를 활용해서 클라이언트 사이드와 서버 사이드 컴포넌트(예: 프레임워크, 라이브러리) 및 그 의존성의 버전 정보를 지속적으로 목록화한다. * 사용 중인 컴포넌트에 대한 취약점들을 CVE(Common Vulnerabilities and Exposures), 미국 정부가 운영하는 취약점 데이터베이스(National Vulnerability Database), [OSV(Open Source Vulnerabilities)](https://osv.dev/)와 같은 출처를 지속적으로 모니터링한다. 이를 위해 소프트웨어 구성 분석(software composition analysis, SCA) 도구, 소프트웨어 공급망 도구, 보안에 초점이 맞춰진 SBOM 도구를 사용해 이 과정을 자동화한다. 사용 중인 컴포넌트와 관련된 보안 취약점 알림을 구독한다. * 공식(신뢰할 수 있는) 출처에서 암호화가 적용된 링크를 통해서만 컴포넌트를 획득한다. 변조되었거나 악성 컴포넌트가 포함될 가능성을 줄이기 위해 서명된 패키지를 우선시한다. (참고. [A08:2025-소프트웨어, 데이터 무결성 실패](https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/)) * 의존성의 어떤 버전을 사용할지 의도적으로 선택하고, 필요가 있을 때만 업그레이드한다. * 관리되지 않거나 보안 패치가 이루어지지 않는 오래된 버전의 라이브러리, 컴포넌트 사용 여부를 모니터링한다. 만약 패치가 불가능하다면 대체품으로 마이그레이션하는 것을 고려한다. 그것 또한 불가능하다면 가상 패치(virtual patch)를 적용해 발견된 문제에 대해 모니터링, 탐지, 방어하는 방안을 고려한다. * CI/CD, IDE, 기타 개발 도구를 주기적으로 업데이트한다. -* 모든 시스템에 업데이트를 동시에 배포하는 것을 피한다. 신뢰하는 벤더가 침해된 경우를 대비하여 공격의 영향을 제한하기 위해 점진적 배포나 카나리 배포한다. +* 모든 시스템에 업데이트를 동시에 배포하는 것을 피한다. 신뢰하는 벤더가 침해된 경우를 대비하여 공격의 영향을 제한하기 위해 점진적 배포나 카나리 배포를 수행한다. 다음과 같은 항목의 변경 사항을 추적하기 위해 변경 관리 프로세스 또는 추적 시스템을 마련한다. @@ -101,7 +101,7 @@ * 컨테이너 레지스트리 -다음과 같은 시스템을 하드닝하라. 하드닝에는 MFA를 활성화하고 IAM을 권한을 제한하는 조치가 포함된다. +다음과 같은 시스템을 하드닝하라. 하드닝에는 MFA를 활성화하고 IAM의 권한을 제한하는 조치가 포함된다. * 코드 저장소: 시크릿 커밋 금지, 브랜치 보호, 백업 설정 * 개발자 워크스테이션: 주기적 패치, 다중 인증(MFA), 모니터링 등 @@ -123,7 +123,7 @@ **시나리오 3:** 2025년에 발생한 [`Shai-Hulud` 공급망 공격](https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem)은 최초로 성공한 자기복제형 npm 웜이다. 공격자는 인기 패키지에 악성코드를 심어 배포했으며, 이 패키지들은 post-install 스크립트를 통해 민감 정보를 수집하여 공개된 GitHub 저장소로 유출했다. 해당 악성코드는 피해자 환경에서 npm 토큰을 탐지하고, 이를 이용해 접근할 수 있는 모든 패키지에 자동으로 악성 버전을 배포했다. 이 웜은 npm에 의해 차단되기 전까지 500개 이상의 패키지에 확산했다. 이 공급망 공격은 고도화된 공격이며 빠르게 전파되어 심각한 피해를 줬으며, 개발자 환경을 직접 표적으로 삼아 개발자 자신이 공급망 공격의 주요 대상이 될 수 있음을 보여주었다. -**시나리오 4:** 컴포넌트는 일반적으로 애플리케이션과 동일한 권한으로 실행되므로, 컴포넌트의 취약점이 있으면 심각한 영향을 미칠 수 있다. 이러한 취약점은 우발적(예: 코딩 에러)이거나, 의도적(예: 컴포넌트 내 백도어)일 수 있다. 지금까지 발결된 악용 가능한 컴포넌트 취약점 사례는 다음과 같다. +**시나리오 4:** 컴포넌트는 일반적으로 애플리케이션과 동일한 권한으로 실행되므로, 컴포넌트의 취약점이 있으면 심각한 영향을 미칠 수 있다. 이러한 취약점은 우발적(예: 코딩 에러)이거나, 의도적(예: 컴포넌트 내 백도어)일 수 있다. 지금까지 발견된 악용 가능한 컴포넌트 취약점 사례는 다음과 같다. * CVE-2017-5638: Struts 2의 원격 코드 실행 취약점으로, 서버에서 임의 코드 실행 가능하여 다수의 심각한 침해 사고의 원인이 되었다. * CVE-2021-44228("Log4Shell"): Apache Log4j의 제로데이 원격 코드 실행 취약점으로, 랜섬웨어, 암호화폐 채굴 등 다양한 공격 캠페인에 악용되었다. From c4b9c9f6934f208ed559cafa67b348b4e566da67 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 18:31:49 +0900 Subject: [PATCH 143/167] Remove dot from h2s --- .../docs/ko/A01_2025-Broken_Access_Control.md | 14 ++++---- .../ko/A02_2025-Security_Misconfiguration.md | 14 ++++---- ...A03_2025-Software_Supply_Chain_Failures.md | 14 ++++---- 2025/docs/ko/A05_2025-Injection.md | 14 ++++---- 2025/docs/ko/A06_2025-Insecure_Design.md | 14 ++++---- .../ko/A07_2025-Authentication_Failures.md | 14 ++++---- ...025-Software_or_Data_Integrity_Failures.md | 26 +++++++------- ...-Security_Logging_and_Alerting_Failures.md | 14 ++++---- ...5-Mishandling_of_Exceptional_Conditions.md | 14 ++++---- 2025/docs/ko/X01_2025-Next_Steps.md | 34 +++++++++---------- 10 files changed, 86 insertions(+), 86 deletions(-) diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md index 93ca3f0d6..cf6353912 100644 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -2,11 +2,11 @@ -## 배경. +## 배경 불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할 만한 CWE는 *CWE-200: 비인가자에게 민감 정보 노출*, *CWE-201: 전송된 데이터로부터의 민감 정보 노출*, *CWE-918: 서버 측 요청 위조(SSRF)*, 그리고 *CWE-352: 크로스 사이트 요청 위조(CSRF)* 가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. -## 점수표. +## 점수표
@@ -54,7 +54,7 @@ -## 설명. +## 설명 접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 접근 제어 실패는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제, 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔히 발견되는 불충분한 접근 제어 취약점 목록은 다음과 같다. @@ -68,7 +68,7 @@ * 강제 브라우징(URL 추측)을 통해 인증이 필요한 페이지에 인증 없이 접근하거나, 일반 사용자가 권한이 필요한 페이지에 접근할 경우. -## 대응 방안. +## 대응 방안 접근 제어는 공격자가 접근 제어 검사나 메타데이터를 변조할 수 없는 곳에서 신뢰할 수 있는 서버 측 코드나 서버리스 API들로 수행될 때 실효성이 있다. @@ -86,7 +86,7 @@ 개발자와 QA 담당자는 단위 및 통합 테스트에서 접근 제어를 포함해야 한다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1:** 이 애플리케이션은 계정 정보에 접근하는 SQL 요청에서 검증되지 않은 데이터를 사용한다. @@ -126,7 +126,7 @@ $ curl https://example.com/app/admin_getappInfo -## 참조. +## 참조 * [OWASP Proactive Controls: C1: Implement Access Control](https://top10proactive.owasp.org/archive/2024/the-top-10/c1-accesscontrol/) * [OWASP Application Security Verification Standard: V8 Authorization](https://github.com/OWASP/ASVS/blob/master/5.0/en/0x17-V8-Authorization.md) @@ -136,7 +136,7 @@ $ curl https://example.com/app/admin_getappInfo * [OAuth: Revoking Access](https://www.oauth.com/oauth2-servers/listing-authorizations/revoking-access/) -## 해당되는 CWE 목록. +## 해당되는 CWE 목록 * [CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')](https://cwe.mitre.org/data/definitions/22.html) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index 7378dd3a9..e8fd06213 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -1,12 +1,12 @@ # A02:2025 보안 설정 오류 ![icon](../assets/TOP_10_Icons_Final_Security_Misconfiguration.png){: style="height:80px;width:80px" align="right"} -## 배경. +## 배경 지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트 된 모든 애플리케이션에서 잘못된 설정 중 한 가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3%이며, 총 CWE는 1,375개이고 71만 9천 개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할 만한 CWE로는 *CWE-16: 설정* 그리고 *CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)*가 있다. -## 점수표. +## 점수표
@@ -54,7 +54,7 @@ -## 설명. +## 설명 보안 설정 오류는 보안 관점에서 시스템, 애플리케이션, 클라우드 서비스 설정이 잘못되어 취약점이 발생하는 것을 말한다. @@ -73,7 +73,7 @@ 일관되고 재사용 가능한 애플리케이션 보안 설정 하드닝 절차가 없다면 시스템은 더 높은 위험에 놓인다. -## 대응 방안. +## 대응 방안 다음과 같은 항목들을 포함하여 보안성이 반영된 구성 절차를 수립한다. @@ -88,7 +88,7 @@ * 코드, 설정 파일, 파이프라인 내 정적인 키나 시크릿을 저장하는 대신 플랫폼에서 제공하는 아이덴티티 페더레이션, 단기 유효 자격 증명, 또는 역할 기반 접근 메커니즘을 사용한다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1:** 운영 서버에서 테스트용 애플리케이션이 지워지지 않았다. 테스트용 애플리케이션은 공격자가 해당 서버를 공격할 수 있는 보안 취약점이 존재한다고 알려져 있으며, 그중 하나의 애플리케이션은 관리자용 콘솔이라 가정해 보겠다. 그리고 기본 계정은 변경되지 않았다. 이런 경우 공격자는 기본 계정으로 로그인한 뒤 시스템 장악이 가능하다. @@ -98,7 +98,7 @@ **시나리오 4:** 클라우드 서비스 제공자(Cloud service provider, CSP)는 인터넷에 자원을 공유하는 권한이 기본 설정이다. 이는 민감한 정보가 공개된 클라우드 스토리지 내 저장될 시 관계자 외 접근을 허용할 수 있다. -## 참조. +## 참조 * [OWASP Testing Guide: Configuration Management](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/README) * [OWASP Testing Guide: Testing for Error Codes](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/08-Testing_for_Error_Handling/01-Testing_For_Improper_Error_Handling) @@ -108,7 +108,7 @@ * [Amazon S3 Bucket Discovery and Enumeration](https://blog.websecurify.com/2017/10/aws-s3-bucket-discovery.html) * ScienceDirect: Security Misconfiguration -## 해당되는 CWE 목록. +## 해당되는 CWE 목록 * [CWE-5 J2EE Misconfiguration: Data Transmission Without Encryption](https://cwe.mitre.org/data/definitions/5.html) diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index 8a42403e3..b29a0518b 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -1,11 +1,11 @@ # A03:2025 소프트웨어 공급망 실패 ![icon](../assets/TOP_10_Icons_Final_Vulnerable_Outdated_Components.png){: style="height:80px;width:80px" align="right"} -## 배경. +## 배경 소프트웨어 공급망 실패는 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정하였다. 2013년 TOP 10에 "A9 - 사용 중인 컴포넌트 내 알려진 취약점" 으로 처음 등장한 이후, 해당 카테고리는 "알려진 취약점" 외에도 "모든 공급망 실패"를 포함하도록 범위가 확장되었다. 범위가 확대됨에도 불구하고, 공급망 실패는 여전히 식별이 어려우며, 관련 CWE와 매핑된 CVE가 11개에 불과하다. 그러나, 수집한 데이터를 테스트하고 보고한 결과에 따르면 이번 카테고리는 5.19%라는 가장 높은 평균 발생률을 보였고, 관련된 CWE로는 *CWE-477: 더 이상 사용되지 않는 기능 사용*, *CWE-1104: 관리되지 않은 외부 컴포넌트 사용*, *CWE-1329: 업데이트할 수 없는 컴포넌트에 대한 의존*, 그리고 *CWE-1395: 취약한 외부 컴포넌트 의존* 이 있다. -## 점수표. +## 점수표
@@ -53,7 +53,7 @@ -## 설명. +## 설명 소프트웨어 공급망 실패는 소프트웨어를 개발, 배포, 업데이트하는 과정에서 발생하는 장애 또는 침해를 의미한다. 이는 주로 외부 코드, 도구, 시스템이 신뢰하는 의존성이 악의적으로 변조되거나 의존성에 존재하는 취약점이 원인이 된다. @@ -71,7 +71,7 @@ * 시스템의 모든 구성 요소에 대한 설정이 안전하지 않은 경우. (참고. [A02:2025-보안 설정 오류](https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/)) * CI/CD 파이프라인의 보안이 빌드하고 배포하는 시스템보다 취약한 경우, 특히 파이프라인이 복잡할수록 취약하다. -## 대응 방안. +## 대응 방안 패치 관리 프로세스 내 다음과 같은 사항이 포함되어야 한다. @@ -111,7 +111,7 @@ 모든 조직은 해당 애플리케이션 또는 포트폴리오의 생명 주기 동안, 업데이트나 설정 변경 사항을 계속 감시하고 중요도를 판단해 우선순위를 정한 뒤 적시에 반영할 수 있는 상시적인 운영 계획을 갖춰야 한다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1:** 신뢰하는 벤더가 악성코드에 감염되어, 업데이트하는 과정에서 내부 시스템까지 침해되는 경우. 가장 유명한 사례는 다음과 같다. @@ -129,7 +129,7 @@ * CVE-2021-44228("Log4Shell"): Apache Log4j의 제로데이 원격 코드 실행 취약점으로, 랜섬웨어, 암호화폐 채굴 등 다양한 공격 캠페인에 악용되었다. -## 참조. +## 참조 * [OWASP Application Security Verification Standard: V15 Secure Coding and Architecture](https://owasp.org/www-project-application-security-verification-standard/) * [OWASP Cheat Sheet Series: Dependency Graph SBOM](https://cheatsheetseries.owasp.org/cheatsheets/Dependency_Graph_SBOM_Cheat_Sheet.html) @@ -151,7 +151,7 @@ * [PhantomRaven supply chain attack campaign](https://thehackernews.com/2025/10/phantomraven-malware-found-in-126-npm.html) -## 해당되는 CWE. +## 해당되는 CWE * [CWE-477 Use of Obsolete Function](https://cwe.mitre.org/data/definitions/477.html) diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index b31933903..3ab70734b 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -1,10 +1,10 @@ # A05:2025 인젝션 ![icon](../assets/TOP_10_Icons_Final_Injection.png){: style="height:80px;width:80px" align="right"} -## 배경. +## 배경 인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화('크로스 사이트 스크립팅')에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향도가 낮아졌다. -## 점수표. +## 점수표
@@ -52,7 +52,7 @@ -## 설명. +## 설명 인젝션 취약점은 신뢰할 수 없는 사용자 입력이 인터프리터(예: 브라우저, 데이터베이스, 커맨드 라인)로 전송되어 인터프리터가 해당 입력의 일부를 명령으로 실행하도록 허용하는 애플리케이션 결함이다. @@ -68,7 +68,7 @@ 한편 LLM 환경에서도 유사한 계열의 인젝션 취약점이 흔해지고 있다. 이는 [OWASP LLM Top 10](https://genai.owasp.org/llm-top-10/)에서 별도로 다룬다. 특히 [LLM01:2025 프롬프트 인젝션](https://genai.owasp.org/llmrisk/llm01-prompt-injection/) 항목에서 관련 내용을 확인할 수 있다. -## 대응 방안. +## 대응 방안 인젝션 공격을 예방하는 최선의 방법은 데이터를 명령 및 쿼리로부터 분리하여 유지하는 것이다. @@ -83,7 +83,7 @@ **경고** 위 방법들은 문자열을 파싱하고 이스케이프하는 복잡한 처리를 전제로 하며, 구현 실수가 발생하기 쉽고 시스템 내부 동작이 조금만 바뀌어도 방어가 쉽게 무력화될 수 있다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1:** 애플리케이션이 신뢰할 수 없는 데이터를 사용하여 다음과 같은 취약 방식으로 SQL을 호출한다. @@ -116,7 +116,7 @@ Runtime.getRuntime().exec(cmd); 공격자는 `example.com; cat /etc/passwd`를 입력하여 서버에서 임의의 명령을 실행한다. -## 참조. +## 참조 * [OWASP Proactive Controls: Secure Database Access](https://owasp.org/www-project-proactive-controls/v3/en/c3-secure-database) * [OWASP ASVS: V5 Input Validation and Encoding](https://owasp.org/www-project-application-security-verification-standard) @@ -131,7 +131,7 @@ Runtime.getRuntime().exec(cmd); -## 해당되는 CWE 목록. +## 해당되는 CWE 목록 * [CWE-20 Improper Input Validation](https://cwe.mitre.org/data/definitions/20.html) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 290e4c130..232c8cb9e 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -1,13 +1,13 @@ # A06:2025 안전하지 않은 설계 ![icon](../assets/TOP_10_Icons_Final_Insecure_Design.png){: style="height:80px;width:80px" align="right"} -## 배경. +## 배경 안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, 설계상 안전(Secure by Design, SbD)의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. -## 점수표. +## 점수표
@@ -55,7 +55,7 @@ -## 설명. +## 설명 안전하지 않은 설계는 다양한 유형의 약점을 포괄하는 범주로, 주로 "빠졌거나 비효과적인 통제 설계"로 나타난다. 또한 이 카테고리가 다른 모든 Top 10 위험의 근본 원인이라고 보기는 어렵다. 안전하지 않은 설계와 안전하지 않은 구현은 차이가 있어 구분되어야 하며, 설계 결함과 구현 결함은 근본 원인이 다르며, 개발 과정에서의 발생 시점이 다르고, 그리고 개선 방법도 다르다. 안전한 설계를 하더라도 구현상 결함을 가질 수 있으며, 이에 따라 취약점이 발생할 수 있다. 안전하지 않은 설계는 필요한 보안 통제가 특정 공격에 대해 방어하기 위해 대비되지 않았기 때문에, 완벽한 구현만으로는 수정될 수 없다. 안전하지 않은 설계의 원인 중 하나는 개발 대상 소프트웨어 및 시스템에 대한 비즈니스 리스크 프로파일링이 부족한 것이며, 그 결과 요구되는 보안 설계 수준을 적절히 산정하지 못하는 것이다. @@ -83,7 +83,7 @@ 개발자가 보안에 대해 주도적으로 책임져야 한다는 인식이 종종 부족하다. 보안 인식과 책임감을 강화하고, 위험을 사전에 완화하려는 문화를 조성하라. 보안에 관한 정기적인 교류(예: 위협 모델링 세션 도중)는 모든 중요한 설계 의사결정에 보안을 포함시키기 위한 마인드셋을 형성할 수 있다. -## 대응 방안. +## 대응 방안 * 보안 및 프라이버시 관련 통제를 평가하고 설계하는 데 도움받기 위해 애플리케이션 보안 전문가와 함께 안전한 개발 생명주기(SDLC)를 수립하고 운영한다. @@ -98,7 +98,7 @@ * 전 계층에서 테넌트를 구조적으로 격리되도록 한다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1:** 계정 복구 절차에 "질문-답변 방식"을 넣는 경우가 있는데, 이는 NIST 800-63b, OWASP ASVS 및 OWASP Top 10에서 금지하는 설계다. 질문-답변은 여러 사람이 답을 알고 있을 수 있어 본인 확인의 근거로 신뢰하기 어렵다. 따라서 해당 기능은 제거하고, 보다 안전한 복구 설계로 대체하는 것이 바람직하다. @@ -107,7 +107,7 @@ **시나리오 3:** 한 유통 체인의 전자상거래 사이트가 리셀러 구매 봇을 차단하지 못하면, 고가 그래픽카드가 대량 매집되어 리셀 채널로 흘러갈 수 있다. 이는 제조사와 유통사 모두에 대한 부정적 여론을 초래하고, 해당 제품을 어떤 가격에서도 구할 수 없었던 마니아층의 반감을 장기화한다. 제품 판매 개시 직후 극단적으로 짧은 시간 내 구매, 비정상 다량 구매 등 도메인 규칙 기반의 봇 방어 설계를 적용하면, 비정상 구매를 탐지해 거래를 거절할 수 있다. -## 참조. +## 참조 @@ -119,7 +119,7 @@ * [Awesome Threat Modeling](https://github.com/hysnsec/awesome-threat-modelling) -## 해당되는 CWE 목록. +## 해당되는 CWE 목록 * [CWE-73 External Control of File Name or Path](https://cwe.mitre.org/data/definitions/73.html) diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index 14e20e32e..69f2b2391 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -1,12 +1,12 @@ # A07:2025 인증 실패 ![icon](../assets/TOP_10_Icons_Final_Identification_and_Authentication_Failures.png){: style="height:80px;width:80px" align="right"} -## 배경. +## 배경 인증 실패는 동일하게 7위를 유지하고 있으며, 해당 카테고리에 해당되는 36개의 CWE를 보다 정확하게 반영하기 위해 명칭을 약간 변경했다. 표준화된 프레임워크로부터의 이점에도 불구하고, 이 카테고리는 2021년부터 7위를 유지해 왔다. 대표적인 CWE로는 *CWE-259 하드코딩된 비밀번호 사용*, *CWE-297: 호스트 불일치 상황에서의 인증서 검증 미흡*, *CWE-287: 부적절한 인증*, *CWE-384: 세션 고정(Session Fixation)*, 그리고 *CWE-798 하드코딩된 자격 증명 사용*이 포함된다. -## 점수표. +## 점수표
@@ -54,7 +54,7 @@ -## 설명. +## 설명 공격자가 시스템을 속여 유효하지 않거나 잘못된 사용자 정보를 정상 사용자로 인증되도록 만들 수 있는 경우, 해당 취약점이 존재한다고 판단한다. 특히 애플리케이션이 아래와 같은 행위를 실질적으로 방어하지 못하면 인증 관련 약점이 있을 수 있다. @@ -82,7 +82,7 @@ * 제공된 자격 증명의 범위(scope) 및 의도된 대상(audience)을 올바르게 검증하지 않는 경우. -## 대응 방안. +## 대응 방안 * 가능하다면 MFA를 도입하고 강제 적용하여 자동화된 크리덴셜 스터핑, 무차별 대입 공격 및 탈취된 자격 증명의 재사용 공격을 차단한다. @@ -108,7 +108,7 @@ * 제공된 자격 증명의 의도된 용도를 검증한다. 예를 들어 JWT의 경우 `aud`와 `iss` 클레임 및 범위를 검증한다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1:** 크리덴셜 스터핑은 유출된 계정-비밀번호 조합을 자동으로 대입하는 대표적인 공격이다. 최근에는 사람들의 습관을 악용해 비밀번호의 숫자를 증가 및 감소시켜 가며 공격하는 사례가 확인되고 있다. 예를 들어, 예를 들어 'Winter2025'를 'Winter2026'으로 바꾸거나, 'ILoveMyDog6'를 'ILoveMyDog7' 또는 'ILoveMyDog5'로 바꾸는 식이다. 이러한 공격을 하이브리드 크리덴셜 스터핑 공격 또는 패스워드 스프레이 공격이라고 하며, 기존의 크리덴셜 스터핑보다 더 효과적일 수 있다. 애플리케이션이 자동화된 위협(무차별 대입, 스크립트, 봇) 또는 크리덴셜 스터핑에 대한 방어를 구현하지 않으면, 해당 애플리케이션은 자격 증명이 유효한지 여부를 판별하는 패스워드 오라클로 악용되어 비인가 접근을 획득하는 데 사용될 수 있다. @@ -116,14 +116,14 @@ **시나리오 3:** 애플리케이션의 세션 타임아웃이 올바르게 구현되지 않았다. 사용자가 공용 컴퓨터에서 애플리케이션에 접근한 뒤 "로그아웃" 버튼 대신 브라우저 탭을 닫고 자리를 떠난다. 또 다른 예로, SSO(Single Sign-On) 환경에서 단일 로그아웃(Single Logout)이 지원되지 않는 경우가 있다. 즉, SSO로 메일, 문서 시스템, 채팅 시스템에 한 번에 로그인되지만, 로그아웃은 현재 사용 중인 시스템에서만 로그아웃 처리된다. 이 상태에서 공격자가 동일한 브라우저를 사용하면, 다른 애플리케이션에는 세션이 남아 있어 피해자 계정에 접근할 수 있다. 동일한 문제는 민감한 애플리케이션이 적절히 종료되지 않은 상태에서 동료가 잠금 해제된 컴퓨터에 일시적으로 접근할 수 있는 사무실 환경에서도 발생할 수 있다. -## 참조. +## 참조 * [OWASP Authentication Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html) * [OWASP Secure Coding Practices](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/stable-en/01-introduction/05-introduction) -## 해당되는 CWE 목록. +## 해당되는 CWE 목록 * [CWE-258 Empty Password in Configuration File](https://cwe.mitre.org/data/definitions/258.html) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index 2735cf136..bf1bd6c35 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -1,32 +1,32 @@ # A08:2025 소프트웨어 또는 데이터 무결성 실패 ![icon](../assets/TOP_10_Icons_Final_Software_and_Data_Integrity_Failures.png){: style="height:80px;width:80px" align="right"} -## 배경. +## 배경 소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 *및* 데이터 무결성 실패"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 해당 카테고리는 소프트웨어 공급망 실패보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 CWE로는 *CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함*, *CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정*, *CWE-502: 신뢰할 수 없는 데이터의 역직렬화*가 있다. -## 점수 표. +## 점수표
- - - - - - @@ -53,11 +53,11 @@ -## 설명. +## 설명 소프트웨어 및 데이터 무결성 실패는 유효하지 않거나 신뢰할 수 없는 코드 또는 데이터가 신뢰할 수 있고 유효한 것으로 취급되는 것을 방지하지 못하는 코드 및 인프라와 관련된다. 예를 들어, 애플리케이션이 신뢰할 수 없는 출처, 저장소, 콘텐츠 전송 네트워크(CDN)에서 제공되는 플러그인, 라이브러리, 모듈에 의존하는 경우가 이에 해당한다. 소프트웨어 무결성 검증을 수행하지 않거나 제공하지 않는 불안전한 CI/CD 파이프라인은 비인가 접근, 불안전하거나 악의적인 코드, 또는 시스템 손상으로 이어질 잠재적 위험을 초래할 수 있다. 또 다른 예로, CI/CD가 신뢰할 수 없는 장소에서 코드나 아티팩트를 가져오고, 사용 전에 서명 확인 등 유사한 메커니즘으로 이를 검증하지 않는 경우가 있다. 마지막으로, 많은 애플리케이션에는 자동 업데이트 기능이 포함되어 있는데, 업데이트가 충분한 무결성 검증 없이 다운로드되어 기존에 신뢰하던 애플리케이션에 그대로 적용되는 경우가 있다. 이런 구조에서는 공격자가 자신의 업데이트를 업로드해 이를 모든 설치본에 배포, 실행되도록 만들 수 있다. 또 다른 예로, 객체나 데이터가 공격자가 확인하고 수정할 수 있는 형태로 인코딩되거나 직렬화된 경우, 불안전한 역직렬화(insecure deserialization)에 취약해질 수 있다. -## 예방 방법. +## 대응 방안 @@ -68,7 +68,7 @@ * 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 수신된 뒤, 변조 또는 재전송을 탐지하기 위한 무결성 검사나 디지털 서명 없이 사용되지 않도록 보장한다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1 신뢰할 수 없는 외부 웹 기능 연동:** 한 회사가 고객 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 고객 지원 제공업체로 전송된다. 고객 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. @@ -78,7 +78,7 @@ **시나리오 4 불안전한 역직렬화:** 한 React 애플리케이션이 여러 Spring Boot 마이크로서비스를 호출한다. 함수형 프로그래밍을 지향하던 이들은 코드의 불변성을 보장하려고 했다. 그들이 선택한 해결책은 사용자 상태를 직렬화하여 각 요청마다 이를 주고받는 것이었다. 공격자는 (base64로 인코딩된) "rO0" 자바 객체 시그니처를 발견하고, [Java Deserialization Scanner](https://github.com/federicodotta/Java-Deserialization-Scanner)를 사용해 애플리케이션 서버에서 원격 코드 실행(RCE)을 획득한다. -## 참조. +## 참조 * [OWASP Cheat Sheet: Software Supply Chain Security](https://cheatsheetseries.owasp.org/cheatsheets/Software_Supply_Chain_Security_Cheat_Sheet.html) * [OWASP Cheat Sheet: Infrastructure as Code](https://cheatsheetseries.owasp.org/cheatsheets/Infrastructure_as_Code_Security_Cheat_Sheet.html) @@ -90,7 +90,7 @@ * [Insecure Deserialization by Tenendo](https://tenendo.com/insecure-deserialization/) -## 매핑된 CWE 목록 +## 해당되는 CWE 목록 * [CWE-345 Insufficient Verification of Data Authenticity](https://cwe.mitre.org/data/definitions/345.html) diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index 1c5a2ea70..e31463732 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -1,12 +1,12 @@ # A09:2025 보안 로깅 및 알림 실패 ![icon](../assets/TOP_10_Icons_Final_Security_Logging_and_Monitoring_Failures.png){: style="height:80px;width:80px" align="right"} -## 배경. +## 배경 보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *로그 기록 시 출력 인코딩 처리 미흡(CWE-117), 로그에 민감 정보 기록(CWE-532), 그리고 불충분한 로깅(CWE-778)이다.* -## 점수표. +## 점수표
매핑된 CWE 수 + 해당되는 CWE 개수 최대 발생률 평균 발생률 최대 커버리지 + 최대 테스트 커버리지 평균 커버리지 + 평균 테스트 커버리지 평균 가중 악용 + 평균 가중 악용도 평균 가중 영향 + 평균 가중 영향도 총 발생 건수 총 CVE 수 + 총 CVE 건수
@@ -54,7 +54,7 @@ -## 설명. +## 설명 로깅과 모니터링이 없으면 공격 및 침해를 탐지할 수 없으며, 알림이 없으면 보안 인시던트 발생 시 신속하고 효과적으로 대응하기가 매우 어렵다. 아래와 같은 경우, 능동적 대응을 위한 로깅, 지속적 모니터링, 탐지, 알림이 부족한 것으로 볼 수 있다. @@ -74,7 +74,7 @@ * 유스케이스에 대한 플레이북이 불완전하거나, 최신이 아니거나, 누락되어 감지된 알림을 올바르게 처리할 수 없는 경우. -## 대응 방안. +## 대응 방안 개발자는 애플리케이션의 위험도에 따라 아래 통제 항목 중 일부 또는 전체를 구현해야 한다. @@ -94,7 +94,7 @@ 추가로, OWASP ModSecurity 핵심 규칙 세트(Core Rule Set)와 같은 상용 및 오픈소스 애플리케이션 보호 제품, 그리고 사용자 정의 대시보드 및 알림 기능을 제공하여 대응에 도움이 될 수 있는 Elasticsearch, Logstash, Kibana(ELK) 스택과 같은 오픈소스 로그 상관분석 소프트웨어가 있다. 공격에 준실시간으로 대응하거나 이를 차단하는 데 도움이 되는 상용 옵저버빌리티(observability) 도구도 존재한다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1:** 한 아동 건강보험 제공업체의 웹사이트 운영자는 모니터링 및 로깅 부재로 인해 침해 사고를 탐지하지 못했다. 외부 제3자가 해당 제공업체에 공격자가 350만 명이 넘는 아동의 민감한 건강 기록 수천 건에 접근하여 이를 수정했다고 통보했다. 사후 분석에서는 웹사이트 개발자가 중대한 취약점을 장기간 방치된 정황이 확인되었으며, 시스템의 로그와 모니터링되고 있지 않아 침해가 2013년부터 7년 이상 지속되었을 가능성도 존재한다. @@ -103,7 +103,7 @@ **사나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취되었다. 그 결과 항공사는 개인정보 감독기관으로부터 2,000만 파운드의 벌금을 부과받았다. -## 참조. +## 참조 - [OWASP Proactive Controls: C9: Implement Logging and Monitoring](https://top10proactive.owasp.org/archive/2024/the-top-10/c9-security-logging-and-monitoring/) @@ -122,7 +122,7 @@ - [Real world example of such failures in Snowflake Breach](https://www.huntress.com/threat-library/data-breach/snowflake-data-breach) -## 해당되는 CWE 목록. +## 해당되는 CWE 목록 * [CWE-117 Improper Output Neutralization for Logs](https://cwe.mitre.org/data/definitions/117.html) diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index ded875dfa..465dee32d 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -1,13 +1,13 @@ # A10:2025 부적절한 예외 처리 ![icon](../assets/TOP_10_Icons_Final_Mishandling_of_Exceptional_Conditions.png){: style="height:80px;width:80px" align="right"} -## 배경. +## 배경 부적절한 예외 처리는 2025년에 신설된 카테고리다. 이 카테고리는 24개의 CWE를 포함하며, 부적절한 오류 처리, 논리적 오류, 페일 오픈(fail open), 그 외 시스템이 비정상적인 상황에서 마주할 수 있는 시나리오를 다룬다. 이 카테고리에는 이전에 낮은 코드 품질과 연관되었던 일부 CWE가 포함되어 있다. 기존의 낮은 코드 품질 카테고리는 너무 광범위했기에, 부적절한 예외 처리라는 구체적인 카테고리로 분리하여 더 명확한 가이드를 제공하고자 했다. 대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족에 대한 부적절한 처리*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 취약한 실패 처리('Failing Open')*가 있다. -## 점수표. +## 점수표
@@ -55,7 +55,7 @@ -## 설명. +## 설명 부적절한 예외 처리는 프로그램이 비정상적이고 예측 불가능한 상황을 예방, 탐지, 대응하지 못할 때 발생하며, 이로 인해 시스템 충돌, 예상치 못한 동작, 때로는 보안 취약점까지 초래할 수 있다. 이는 다음 세 가지 실패 중 하나 이상을 포함한다. 비정상적인 상황을 사전에 예방하지 못하거나, 발생 시 이를 식별하지 못하거나, 발생 후 적절히 대응하지 못하는 경우다. @@ -63,7 +63,7 @@ 부적절한 예외 처리로 인해 다양한 보안 취약점이 발생할 수 있다. 예를 들어 논리 버그, 오버플로우, 레이스 컨디션, 부정 거래, 메모리, 상태, 리소스, 타이밍, 인증, 인가 관련 문제 등이 있다. 이러한 유형의 취약점은 시스템 또는 데이터의 기밀성, 가용성, 무결성에 부정적인 영향을 미칠 수 있다. 공격자는 애플리케이션의 결함 있는 오류 처리를 악용하여 이 취약점을 공격한다. -## 대응 방안. +## 대응 방안 예외 상황을 적절히 처리하려면 이러한 상황에 대비한 계획을 세워야 한다(최악의 상황을 예상하라). 모든 시스템 오류를 발생 지점에서 직접 캐치(catch)하고, 이를 처리해야 한다. 여기서 처리란 문제 해결을 위한 의미 있는 조치를 취하고 정상 상태로 복구하는 것을 의미한다. 처리 과정에는 오류 발생 시 사용자에게 이해하기 쉬운 방식으로 알리고, 이벤트를 로깅하며, 필요하다고 판단되면 알림을 발송하는 것이 포함되어야 한다. 또한 놓친 예외가 있을 경우를 대비해 전역 예외 핸들러(Global Exception Handler)를 구현해야 한다. 이상적으로는 반복되는 오류나 진행 중인 공격을 나타내는 패턴을 감시하고, 이에 대응,방어,차단할 수 있는 모니터링 또는 옵저버빌리티 도구를 갖추는 것이 좋다. 이를 통해 오류 처리 취약점을 악용하는 스크립트와 봇에 대응하고 차단할 수 있다. @@ -77,7 +77,7 @@ 가능하다면 조직 전체가 동일한 방식으로 예외 상황을 처리하는 것이 좋다. 이렇게 하면 이 중요한 보안 통제에 대한 코드 리뷰와 감사가 더 쉬워진다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 **시나리오 1:** 애플리케이션이 파일 업로드 시 예외를 캐치하되 리소스를 해제하지 않으면, 예외가 발생할 때마다 리소스가 잠긴 채로 남는다. 이로 인해 리소스가 고갈되어 서비스 거부(DoS)로 이어질 수 있다. @@ -85,7 +85,7 @@ **시나리오 3:** 공격자가 네트워크 장애를 일으켜 여러 단계로 이루어진 트랜젝션을 중간에 방해할 수 있다. 예를 들어 트랜잭션이 사용자 계좌 출금, 대상 계좌 입금, 트랜잭션 로깅 순서로 처리된다고 가정한다면, 중간에 오류가 발생해도 시스템이 전체를 롤백(안전한 실패)하지 않으할 문제가 생긴다. 공격자는 이를 악용해 사용자 계좌에서 돈만 빠져나가게 하거나, 레이스 컨디션을 이용해 대상 계좌로 여러 번 송금할 수 있다. -## 참조. +## 참조 - [OWASP MASVS‑RESILIENCE](https://mas.owasp.org/MASVS/11-MASVS-RESILIENCE/) @@ -105,7 +105,7 @@ * [Example of real-world mishandling of an exceptional condition](https://www.firstreference.com/blog/human-error-and-internal-control-failures-cause-us62m-fine/) -## 해당되는 CWE 목록. +## 해당되는 CWE 목록 * [CWE-209 Generation of Error Message Containing Sensitive Information](https://cwe.mitre.org/data/definitions/209.html) * [CWE-215 Insertion of Sensitive Information Into Debugging Code](https://cwe.mitre.org/data/definitions/215.html) * [CWE-234 Failure to Handle Missing Parameter](https://cwe.mitre.org/data/definitions/234.html) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index 9b11631bd..78e266135 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -7,12 +7,12 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 ## X01:2025 애플리케이션 복원력 부족 -### 배경. +### 배경 이 카테고리의 명칭은 2021년 버전의 서비스 거부(Denial of Service)에서 현재 명칭으로 변경됐다. 기존 명칭은 근본 원인보다는 발생 현상을 설명하는 성격이 강해, 이를 보완하기 위해 재명명되었다. 이 카테고리는 복원력과 관련된 약점을 설명하는 CWE에 초점을 둔다. 점수 산정은 A10:2025-부적절한 예외 처리와 매우 근접했다. 관련된 CWE로는 *CWE-400 통제되지 않은 자원 소비, CWE-409 고압축 데이터의 부적절한 처리(데이터 증폭), CWE-674 통제되지 않은 재귀*, 그리고 *CWE-835 종료 조건에 도달할 수 없는 루프(무한 루프).*가 있다. -### 점수표. +### 점수표
@@ -60,7 +60,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 -### 설명. +### 설명 이 카테고리는 애플리케이션이 스트레스, 장애 및 엣지 케이스에 대응하는 방식 전반에 존재하는 시스템적 약점을 의미하며, 그 결과 장애 발생 시 애플리케이션이 정상 상태로 복구하지 못할 수 있다. 애플리케이션이 예기치 않은 조건, 리소스 제약 및 기타 불리한 이벤트를 원활하게(gracefully) 처리하지 못하거나, 견디지 못하거나, 또는 복구하지 못할 경우, 가용성 문제(일반적으로)로 이어지며, 그 외에도 데이터 손상, 민감 데이터 노출, 연쇄 장애 또는 보안 통제 우회를 유발할 수 있다. @@ -88,7 +88,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 * 세션에 저장되는 상태 정보는 최소화한다. -### 공격 시나리오 예시. +### 공격 시나리오 예시 **시나리오 1:** 공격자가 리소스 소모를 유도해 시스템 장애를 유발하고, 결과적으로 서비스 거부(DoS) 상태를 만든다. 예로 메모리 고갈, 디스크 용량 소진, CPU 사용량 포화, 커넥션 무제한 연결 등이 있다. @@ -97,7 +97,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 **시나리오 3:** 공격자가 애플리케이션의 의존성을 공격하여 API 또는 기타 외부 서비스를 다운시키며, 애플리케이션이 정상 동작할 수 없게 만든다. -### 참조. +### 참조 * [OWASP Cheat Sheet: Denial of Service](https://cheatsheetseries.owasp.org/cheatsheets/Denial_of_Service_Cheat_Sheet.html) * [OWASP MASVS‑RESILIENCE](https://mas.owasp.org/MASVS/11-MASVS-RESILIENCE/) @@ -107,7 +107,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 * [NIST Cybersecurity Framework (CSF)](https://www.nist.gov/cyberframework) * [Avoid Blocking Calls: Go Async in Java (Devlane)](https://www.devlane.com/blog/avoid-blocking-calls-go-async-in-java) -### 해당되는 CWE 목록. +### 해당되는 CWE 목록 * [CWE-73 External Control of File Name or Path](https://cwe.mitre.org/data/definitions/73.html) * [CWE-183 Permissive List of Allowed Inputs](https://cwe.mitre.org/data/definitions/183.html) * [CWE-256 Plaintext Storage of a Password](https://cwe.mitre.org/data/definitions/256.html) @@ -151,12 +151,12 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 ## X02:2025 메모리 관리 실패 -### 배경. +### 배경 Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같은 언어는 메모리 안전한 언어이다. 메모리 관리 문제는 C 및 C++와 같은 메모리가 안전하지 않은 언어에서 발생하는 경향이 있다. 이 카테고리는 관련 CVE가 세 번째로 많음에도 불구하고, 커뮤니티 설문에서는 가장 낮은 점수를 받았고 데이터상에서도 낮게 나타났다. 이는 전통적인 데스크톱 애플리케이션보다 웹 애플리케이션이 우세하기 때문이라고 본다. 메모리 관리 취약점은 대체로 가장 높은 CVSS 점수를 가진다. -### 점수표. +### 점수표
@@ -204,7 +204,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 -### 설명. +### 설명 애플리케이션이 메모리를 직접 관리해야 할 때 실수가 발생하기 쉽다. 메모리 안전 언어가 더 많이 사용되고 있지만, 전 세계 운영 환경에는 여전히 많은 레거시 시스템이 존재하며, 메모리가 안전하지 않은 언어가 필요한 새로운 저수준 시스템과 메인프레임, IoT 장치, 펌웨어 및 자체 메모리를 관리해야 할 수 있는 기타 시스템과 상호작용하는 웹 애플리케이션도 여전히 많다. 대표적인 CWE로는 *CWE-120 입력 크기 확인 없이 버퍼 복사('클래식 버퍼 오버플로')* 및 *CWE-121 스택 기반 버퍼 오버플로*가 있다. @@ -222,7 +222,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 메모리 관리 실패는 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있으며, 이는 [X01:2025 애플리케이션 복원력 부족](#x012025-lack-of-application-resilience)를 함께 참고한다. -### 대응 방안. +### 대응 방안 메모리 관리 실패를 예방하는 최선의 방법은 메모리 안전 언어를 사용하는 것이다. 예로는 Rust, Java, Go, C#, Python, Swift, Kotlin, JavaScript 등이 있다. 새로운 애플리케이션을 개발할 때는 학습 곡선이 있더라도 메모리 안전 언어로 전환할 가치가 있음을 조직 내에서 적극적으로 설득해야 한다. 전면적인 리팩터링을 수행하는 경우에는 가능하고 실현 가능한 범위에서, 메모리 안전 언어로의 재작성을 추진한다. @@ -244,7 +244,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 * 특히 기반 인프라를 대상으로 한 잠재적 메모리 취약점 및 기타 장애 요인을 모니터링한다. * 오버플로 공격으로부터 주소 스택을 보호하기 위해 [카나리(canaries)](https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries) 사용을 고려한다. -### 공격 시나리오 예시. +### 공격 시나리오 예시 **시나리오 1:** 버퍼 오버플로는 가장 유명한 메모리 취약점으로, 공격자가 필드가 수용할 수 있는 것보다 더 많은 데이터를 입력하여 해당 변수에 대해 생성된 버퍼를 넘치게 만드는 상황을 말한다. 공격이 성공하면 넘친 데이터가 스택 포인터를 덮어쓰게 되며, 이를 통해 공격자가 프로그램에 악의적인 명령을 삽입할 수 있게 된다. @@ -254,14 +254,14 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 참고: 현대의 브라우저는 [브라우저 샌드박스](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing), ASLR, DEP/NX, RELRO 및 PIE를 를 포함한 심층적 방어 체계를 사용하기에, 브라우저에 대한 메모리 관리 실패 공격이 쉽지 않다. -### 참조. +### 참조 * [OWASP community pages: Memory leak,](https://owasp.org/www-community/vulnerabilities/Memory_leak) [Doubly freeing memory,](https://owasp.org/www-community/vulnerabilities/Doubly_freeing_memory) [& Buffer Overflow](https://owasp.org/www-community/vulnerabilities/Buffer_Overflow) * [Awesome Fuzzing: a list of fuzzing resources](https://github.com/secfigo/Awesome-Fuzzing) * [Project Zero Blog](https://googleprojectzero.blogspot.com) * [Microsoft MSRC Blog](https://www.microsoft.com/en-us/msrc/blog) -### 해당되는 CWE 목록. +### 해당되는 CWE 목록 * [CWE-14 Compiler Removal of Code to Clear Buffers](https://cwe.mitre.org/data/definitions/14.html) * [CWE-119 Improper Restriction of Operations within the Bounds of a Memory Buffer](https://cwe.mitre.org/data/definitions/119.html) * [CWE-120 Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')](https://cwe.mitre.org/data/definitions/120.html) @@ -287,17 +287,17 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 ## X03:2025 AI 생성 코드에 대한 부적절한 신뢰('바이브 코딩') -### 배경. +### 배경 현재 전 세계가 AI에 대해 이야기하고 활용하고 있으며, 소프트웨어 개발자도 예외는 아니다. 아직 AI 생성 코드와 직접 관련된 CVE나 CWE는 없지만, AI 생성 코드가 인간이 작성한 코드보다 더 많은 취약점을 포함하는 경우가 많다는 사실은 널리 알려져 있고 문서로도 입증되어 있다. -### 설명. +### 설명 우리는 소프트웨어 개발 관행이 변화하여, AI의 도움을 받아 작성한 코드뿐 아니라 사람의 검토 없이 거의 전적으로 작성되어 그대로 커밋되는 코드(흔히 '바이브 코딩'이라 불림)까지 포함하는 흐름을 보고 있다. 예전에도 블로그나 웹사이트의 코드 스니펫을 깊이 생각하지 않고 복사하는 것이 결코 바람직하지 않았던 것과 마찬가지로, 이 경우에는 문제가 더 악화된다. 양질의 보안 코드 스니펫은 예나 지금이나 드물며, 시스템적 제약으로 인해 AI가 이런 좋은 예시를 통계적으로 잘 나타내지 못할 수 있다. -### 대응 방안. +### 대응 방안 AI를 활용해 코드를 작성하는 모든 사람에게 다음 사항을 고려할 것을 권고한다. * AI가 작성했거나 온라인 포럼에서 복사한 코드일지라도, 제출하는 모든 코드를 읽고 완전히 이해할 수 있어야 한다. 커밋하는 모든 코드에 대한 책임은 본인에게 있다. @@ -315,7 +315,7 @@ AI를 활용해 코드를 작성하는 모든 사람에게 다음 사항을 고 * 개발자에게 조직의 정책뿐만 아니라, 안전한 AI 사용 및 소프트웨어 개발에서의 AI 활용 모범 사례에 대한 교육을 실시한다. -### 참조. +### 참조 * [OWASP Cheat Sheet: Secure Code Review](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html) From 8f825d7bf84742df8588e36e7ed4d7f35e43e002 Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 18:32:48 +0900 Subject: [PATCH 144/167] Update Korean language in mkdocs.yml --- 2025/mkdocs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/mkdocs.yml b/2025/mkdocs.yml index ac11dcf61..01d6a4bf6 100644 --- a/2025/mkdocs.yml +++ b/2025/mkdocs.yml @@ -98,9 +98,9 @@ plugins: extra: alternate: # see https://squidfunk.github.io/mkdocs-material/setup/changing-the-language/#site-language-selector - name: en - English - link: ./en/ + link: ./ lang: en - - name: ko - Korean + - name: ko - 한국어 link: ./ko/ lang: ko # - name: de - Deutsch From 0525442a6fcec2c8fa3db24ab7683884da24a8fa Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 18:34:26 +0900 Subject: [PATCH 145/167] Fix typos and improve consistency in terminology related to the software development lifecycle --- ...-Establishing_a_Modern_Application_Security_Program.md | 8 ++++---- 2025/docs/ko/A06_2025-Insecure_Design.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index f401b74ef..dc0af39b4 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -39,9 +39,9 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 개발 및 프로젝트 팀이 각 활동을 성공적으로 수행할 수 있도록 주제별 분야 전문가와 지원 서비스를 제공한다. -* 현행 시스템 개발 수명 주기와 모든 소프트웨어 보안 활동, 도구, 정책, 프로세스를 검토한 후 이를 문서화한다. +* 현행 시스템 개발 생명 주기와 모든 소프트웨어 보안 활동, 도구, 정책, 프로세스를 검토한 후 이를 문서화한다. -* 새로운 소프트웨어 개발 시에는 시스템 개발 수명 주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서 수행 가능한 다양한 활동을 제시한다. 제시된 활동을 수행하여 모든 새로운 프로젝트 또는 소프트웨어에 조직의 요구 사항에 부합하는 보안 수준이 제공되도록 한다. +* 새로운 소프트웨어 개발 시에는 시스템 개발 생명 주기의 각 단계에 하나 이상의 보안 활동을 추가한다. 아래에서 수행 가능한 다양한 활동을 제시한다. 제시된 활동을 수행하여 모든 새로운 프로젝트 또는 소프트웨어에 조직의 요구 사항에 부합하는 보안 수준이 제공되도록 한다. * 최종 산출물이 조직의 수용 가능한 위험 수준을 만족하도록 활동을 선정한다. @@ -105,7 +105,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 기존 사용자 스토리에 보안 사용자 스토리를 추가한다. -### 안전한 개발 수명 주기 +### 안전한 개발 생명 주기 * 조직이 애플리케이션 및 API를 구축할 때 따르는 프로세스를 개선하기 위해, [OWASP 소프트웨어 보증 성숙도 모델(SAMM)](https://owasp.org/www-project-samm/)을 권장한다. 이 모델은 조직이 직면한 특정 위험에 맞춘 소프트웨어 보안 전략을 수립하고 구현하는 데 도움이 된다. @@ -296,6 +296,6 @@ OWASP Top 10을 표준으로 쓰기 어려운 이유는, 각 항목이 애플리
-애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능하게 정의하도록 설계되었고 보안 안전한 개발 수명 주기(SDLC) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)](https://owasp.org/www-project-application-security-verification-standard/)을 기준으로 활용하는 것을 권고한다. +애플리케이션 보안 표준을 채택하려는 경우, 요구사항을 검증(테스트) 가능하게 정의하도록 설계되었고 보안 안전한 개발 생명 주기(SDLC) 전 단계에 적용 가능한 [OWASP 애플리케이션 보안 검증 표준(ASVS)](https://owasp.org/www-project-application-security-verification-standard/)을 기준으로 활용하는 것을 권고한다. 특히 보안 도구 벤더 관점에서는 ASVS를 기준으로 삼는 것이 유일한 선택지이다. OWASP Top 10은 위험 중심으로 구성되어 있기에, [A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md) 사례와 마찬가지로 자동화 도구만으로 모든 Top 10 항목을 포괄적으로 탐지, 테스트, 방어하기 어렵다. 따라서, 벤더들은 Top 10을 전부 보장한다고 주장하지 않았으면 한다. 왜냐하면 이는 사실이 아니기 때문이다. diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 232c8cb9e..b6d590af6 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -63,7 +63,7 @@ * 요구사항 수집 및 리소스 관리 * 안전한 설계 수립 -* 보안 개발 생명주기(Secure Development Lifecycle, SDLC) 보유 +* 보안 개발 생명 주기(Secure Development Lifecycle, SDLC) 보유 ### 요구사항 수집 및 리소스 관리 @@ -76,9 +76,9 @@ 안전한 설계는 지속적으로 위협을 평가하고, 알려진 공격 기법을 방지하기 위해 코드가 견고하게 설계되고 테스트 되도록 보장하는 문화이자 방법론이다. 위협 모델링은 요구사항 개선 단계(혹은 유사한 활동)에 내재화되어야 하며, 이 과정에서 데이터 흐름과 접근 제어 또는 기타 보안 통제의 변화를 중심으로 검토해야 한다. 유저 스토리를 작성할 때 정상 흐름과 실패 흐름을 결정하고, 책임 당사자 및 영향받는 당사자가 이를 충분히 이해하고 합의했는지 확인하라. 또한 정상과 실패 흐름에 대한 가정과 조건을 분석하여 정확하고 바람직한 상태로 유지되는지 확인하라. 올바른 동작을 위해 필요한 가정과 조건을 어떻게 검증하고 강제할지 결정한다. 이 결과는 유저 스토리에 문서화되어야 한다. 과정 중에 발생하는 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공하라. 마지막으로, 안전한 설계는 개발이 완료된 이후에 추가할 수 있는 부가 기능도 아니고 도구도 아니다. -### 보안 개발 생명주기 +### 보안 개발 생명 주기 -안전한 소프트웨어에는 보안 개발 생명주기, 안전한 설계 패턴, 포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것) 방법론, 안전한 컴포넌트 라이브러리, 적절한 도구, 위협 모델링, 그리고 프로세스를 개선하기 위해 사용되는 사고 포스트모템(post-mortem)이 필요하다. 소프트웨어 프로젝트 초기부터 보안 전문가와 협업하고, 개발 전체 과정 및 소프트웨어 유지보수 단계에서도 지속적으로 협업해야 한다. 보안 개발 활동을 체계화하기 위해 [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owaspsamm.org/)와 같은 성숙도 모델을 참고하는 방안을 고려하라. +안전한 소프트웨어에는 보안 개발 생명 주기, 안전한 설계 패턴, 포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것) 방법론, 안전한 컴포넌트 라이브러리, 적절한 도구, 위협 모델링, 그리고 프로세스를 개선하기 위해 사용되는 사고 포스트모템(post-mortem)이 필요하다. 소프트웨어 프로젝트 초기부터 보안 전문가와 협업하고, 개발 전체 과정 및 소프트웨어 유지보수 단계에서도 지속적으로 협업해야 한다. 보안 개발 활동을 체계화하기 위해 [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owaspsamm.org/)와 같은 성숙도 모델을 참고하는 방안을 고려하라. 개발자가 보안에 대해 주도적으로 책임져야 한다는 인식이 종종 부족하다. 보안 인식과 책임감을 강화하고, 위험을 사전에 완화하려는 문화를 조성하라. 보안에 관한 정기적인 교류(예: 위협 모델링 세션 도중)는 모든 중요한 설계 의사결정에 보안을 포함시키기 위한 마인드셋을 형성할 수 있다. @@ -86,7 +86,7 @@ ## 대응 방안 -* 보안 및 프라이버시 관련 통제를 평가하고 설계하는 데 도움받기 위해 애플리케이션 보안 전문가와 함께 안전한 개발 생명주기(SDLC)를 수립하고 운영한다. +* 보안 및 프라이버시 관련 통제를 평가하고 설계하는 데 도움받기 위해 애플리케이션 보안 전문가와 함께 안전한 개발 생명 주기(SDLC)를 수립하고 운영한다. * 안전한 설계 패턴과 포장된 도로 컴포넌트를 라이브러리화하여 사용한다. * 인증, 접근 제어, 비즈니스 로직, 핵심 처리 흐름과 같은 애플리케이션의 중요한 부분을 위협 모델링한다. * 보안 마인드셋을 생성하기 위한 교육 도구로서 위협 모델링을 사용한다. From 43dce85d61ae12a4986849df82010424ec85871d Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Thu, 8 Jan 2026 19:20:56 +0900 Subject: [PATCH 146/167] Fix Korean translation errors in A04 Cryptographic Failures (#39) Co-authored-by: ben-cremit --- .../ko/A04_2025-Cryptographic_Failures.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index e888eaa83..807df9ba6 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -3,12 +3,12 @@ > 옮긴이: 본 문서에서는 "cryptographic"을 "암호"로 번역한다. 이는 종종 "암호화"로 번역되나, 해당 용어는 암호화뿐 아니라 복호화, 해시, 전자서명 등 암호 기술 전반을 포괄하므로 본 문서의 번역어를 "암호"로 통일한다. -## 배경. +## 배경 -암호 실패 카테고리는 이전 버전에서 2단계 하락해 4위가 되었다. 이 카테고리는 암호 부재, 불충분한 암호 강도, 암호키 유출 및 관련 오류에 중점을 둔다. 이 위험에서 가장 흔한 CWE 3개는 약한 의사 난수 생성기(PRNG) 사용과 관련이 있다: *CWE-327: 취약하거나 위험한 암호 알고리즘 사용*, *CWE-331: 불충분한 엔트로피*, *CWE-1241: 난수 생성기 내 예측 가능한 알고리즘 사용*, *CWE-338: 암호학적으로 약한 의사 난수 생성기(PRNG) 사용*. +암호 실패 카테고리는 이전 버전에서 2단계 내려가 4위가 되었다. 이 카테고리는 암호 부재, 불충분한 암호 강도, 암호키 유출 및 관련 오류에 중점을 둔다. 이 위험에서 가장 흔한 CWE 3개는 약한 의사 난수 생성기(PRNG) 사용과 관련이 있다: *CWE-327: 취약하거나 위험한 암호 알고리즘 사용*, *CWE-331: 불충분한 엔트로피*, *CWE-1241: 난수 생성기 내 예측 가능한 알고리즘 사용*, *CWE-338: 암호학적으로 약한 의사 난수 생성기(PRNG) 사용*. -## 점수표. +## 점수표 @@ -56,13 +56,13 @@ -## 설명. +## 설명 일반적으로, [전송 계층](https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 에서의 모든 데이터는 암호화되어 전송해야 한다. 과거에는 CPU 성능과 프라이빗 키/인증서 관리가 장벽이었다. 현재는 암호 연산 가속을 위한 CPU 전용 명령어(예: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 가 도입되었고, [LetsEncrypt.org](https://letsencrypt.org/) 같은 서비스와 대형 클라우드 공급업체가 자사 플랫폼에 긴밀히 통합된 인증서 관리 서비스를 제공하면서 프라이빗 키와 인증서 관리도 간소화되었다. -전송 계층 보안 외에도 어떤 데이터가 저장 시 암호화가 필요한지, 그리고 전송 중([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer), OSI 7계층)에 추가적인 암호화가 필요한지 결정하는 것이 중요하다. 예를 들어 패스워드, 신용카드 번호, 건강 기록, 개인 정보, 비즈니스 기밀은 추가 보호가 필요하다. 특히 해당 데이터가 개인정보 보호법(예: EU의 GDPR)이나 규정(예: PCI-DSS)의 적용을 받는 경우 더욱 중요하다. +전송 계층 보안 외에도 어떤 데이터가 저장 시 암호화가 필요한지, 그리고 전송 중([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer), OSI 7계층)에 추가적인 암호화가 필요한지 결정하는 것이 중요하다. 예를 들어 패스워드, 신용카드 번호, 건강 기록, 개인 정보, 비즈니스 기밀은 추가 보호가 필요하다. 특히 해당 데이터가 개인정보 보호법(예: EU의 GDPR)이나 규정(예: PCI-DSS)의 적용을 받는 경우 더욱 중요하다. 이러한 모든 데이터에 대해 다음을 확인해야 한다. + -이러한 모든 데이터에 대해 다음을 확인해야 한다. * 약하거나 오래된 암호 알고리즘 또는 프로토콜이 기본값으로 사용되거나 레거시 코드에서 사용되고 있는가? * 기본 암호키가 사용되는가? 약한 암호키가 생성되는가? 키가 재사용되는가? 적절한 키 관리 및 키 순환 주기가 없는가? @@ -79,7 +79,7 @@ 레퍼런스 참고 ASVS: Cryptography (V11), Secure Communication (V12) and Data Protection (V14). -## 대응 방안. +## 대응 방안 최소한 다음 사항들을 수행하고 레퍼런스를 참고하라. @@ -89,9 +89,9 @@ * 가장 민감한 키는 하드웨어 또는 클라우드 기반 HSM(하드웨어 보안 모듈)에 보관한다. * 암호 알고리즘은 가능하면 신뢰할 수 있는 구현체(라이브러리)를 사용한다. * 불필요한 민감 데이터는 저장하지 않는다. 저장할 시 가능한 한 빨리 폐기하거나 PCI DSS 준수 토큰화(PCI DSS compliant tokenization) 또는 마스킹(truncation)을 적용한다. 저장하지 않은 데이터는 탈취될 수 없다. -* 저장된 모든 민감 데이터 암호화되었는지 확인한다. +* 저장된 모든 민감 데이터가 암호화되었는지 확인한다. * 최신의 강력한 표준 알고리즘, 프로토콜, 키가 적용되어 있는지 확인하고, 적절한 키 관리를 수행한다. -* 전송 중인 모든 데이터는 TLS 1.2 이상의 프로토콜로만 암호화하고, 전방향 비밀성(Forward Secrecy) 암호를 사용하며, CBC(Cipher Block Chaining) 암호에 대한 지원을 중단하고, 양자 키 교환 알고리즘을 지원한다. HTTPS는 HSTS(HTTP Strict Transport Security)를 사용해 강제한다. 도구를 활용해 모든 항목을 검사한다. +* 전송 중인 모든 데이터는 TLS 1.2 이상의 프로토콜로만 암호화하고, 전방향 비밀성(Forward Secrecy) 암호를 사용하며, CBC(Cipher Block Chaining) 암호에 대한 지원을 중단하고, 양자 내성 키 교환 알고리즘을 지원한다. HTTPS는 HSTS(HTTP Strict Transport Security)를 사용해 강제한다. 도구를 활용해 모든 항목을 검사한다. * 민감 데이터가 포함된 응답의 캐싱을 비활성화한다. 이는 콘텐츠 전송 네트워크(CDN), 웹 서버, 모든 애플리케이션 캐싱(예: Redis)을 포함한다. * 데이터 분류에 따라 필요한 보안 통제를 적용한다. * FTP 나 STARTTLS 같은 암호화되지 않는 프로토콜을 사용하지 않는다. SMTP로 기밀 정보를 전송하는 것은 피한다. @@ -105,14 +105,14 @@ * 지금부터 양자 내성 암호(PQC)를 준비해야 한다(ENISA 참고). 고위험 시스템은 늦어도 2030년 말까지 안전하게 보호되도록 해야 한다. -## 공격 시나리오 예시. +## 공격 시나리오 예시 -**시나리오 1:** A 사이트가 모든 페이지에 TLS를 사용하지 않거나 강제하지 않고, 약한 암호화를 지원한다. 공격자는 네트워크 트래픽을 모니터링하고(예: 안전하지 않은 무선 네트워크), HTTPS 연결을 HTTP로 다운그레이드한 뒤, 요청을 가로채 사용자의 세션 쿠키를 탈취한다. 공격자는 이 쿠키를 재전송해 사용자의 인증된 세션을 하이재킹하여 개인 데이터에 접근하거나 수정한다. 위 방법 외에도 전송되는 모든 데이터를 변조할 수 있다(예: 송금 수신자). +**시나리오 1:** 어떤 사이트가 모든 페이지에 TLS를 사용하지 않거나 강제하지 않고, 약한 암호화를 지원한다. 공격자는 네트워크 트래픽을 모니터링하고(예: 안전하지 않은 무선 네트워크), HTTPS 연결을 HTTP로 다운그레이드한 뒤, 요청을 가로채 사용자의 세션 쿠키를 탈취한다. 공격자는 이 쿠키를 재전송해 사용자의 인증된 세션을 하이재킹하여 개인 데이터에 접근하거나 수정한다. 위 방법 외에도 전송되는 모든 데이터를 변조할 수 있다(예: 송금 수신자). **시나리오 2:** 패스워드 데이터베이스가 솔트 없이 또는 단순한 해시로 모든 사용자의 패스워드를 저장한다. 파일 업로드 취약점으로 공격자가 패스워드 데이터베이스를 탈취할 수 있다. 솔트가 없는 해시는 사전 계산된 레인보우 테이블로 노출될 수 있다. 단순하거나 빠른 해시 함수로 생성된 해시는 솔트가 있더라도 GPU로 크랙할 수 있다. -## 참조. +## 참조 * [OWASP Proactive Controls: C2: Use Cryptography to Protect Data ](https://top10proactive.owasp.org/archive/2024/the-top-10/c2-crypto/) @@ -127,7 +127,7 @@ * [NIST Releases First 3 Finalized Post-Quantum Encryption Standards](https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards) -## 해당되는 CWE 목록. +## 해당되는 CWE 목록 * [CWE-261 Weak Encoding for Password](https://cwe.mitre.org/data/definitions/261.html) From 6ddc84d7fd8666dffbbea0af56310645b398e45e Mon Sep 17 00:00:00 2001 From: ni5am Date: Thu, 8 Jan 2026 20:16:00 +0900 Subject: [PATCH 147/167] Update Korean terminology for exploit and impact scores --- 2025/docs/ko/0x00_2025-Introduction.md | 8 ++++---- ...025-What_are_Application_Security_Risks.md | 20 +++++++++---------- .../docs/ko/A01_2025-Broken_Access_Control.md | 4 ++-- .../ko/A02_2025-Security_Misconfiguration.md | 4 ++-- ...A03_2025-Software_Supply_Chain_Failures.md | 4 ++-- .../ko/A04_2025-Cryptographic_Failures.md | 6 +++--- 2025/docs/ko/A05_2025-Injection.md | 6 +++--- 2025/docs/ko/A06_2025-Insecure_Design.md | 4 ++-- .../ko/A07_2025-Authentication_Failures.md | 4 ++-- ...025-Software_or_Data_Integrity_Failures.md | 4 ++-- ...-Security_Logging_and_Alerting_Failures.md | 4 ++-- ...5-Mishandling_of_Exceptional_Conditions.md | 4 ++-- 2025/docs/ko/X01_2025-Next_Steps.md | 8 ++++---- 13 files changed, 40 insertions(+), 40 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 8b8d3797b..29ff72162 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -58,15 +58,15 @@ MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하 ## 카테고리 선정을 위한 데이터 사용법 -2021년 버전과 마찬가지로 *악용 가능성(Exploitability)* 및 *(기술적) 영향도((Technical) Impact)*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS Exploit 및 Impact 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. +2021년 버전과 마찬가지로 *악용 가능성* 및 *(기술적) 영향*에 대해 CVE 데이터를 활용하였다. OWASP Dependency Check를 다운로드하여 CVSS 익스플로잇 및 영향 점수를 추출하고, CVE에 연결된 관련 CWE별로 그룹화하였다. 모든 CVE에 CVSSv2 점수가 포함되어 있으나 CVSSv2에는 CVSSv3에서 해결된 결함이 있어 상당한 연구와 노력이 필요하였다. 특정 시점 이후의 모든 CVE에는 CVSSv3 점수도 함께 부여된다. 또한 CVSSv2와 CVSSv3 사이에 점수 범위와 산정 공식이 변경되었다. -CVSSv2에서는 Exploit과 (Technical) Impact 모두 최대 10.0까지 가능하였으나, 공식에 따라 Exploit은 60%, Impact는 40%로 조정되었다. CVSSv3에서는 이론상 최댓값이 Exploit 6.0, Impact 4.0으로 제한되었다. 가중치를 고려한 결과, Impact 점수는 CVSSv3에서 평균적으로 약 1.5점 상승하였고, Exploitability는 평균적으로 약 0.5점 하락하였다. +CVSSv2에서는 익스플로잇과 (기술적) 영향 점수 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 익스플로잇 점수는 60%, 영향 점수는 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 익스플로잇 점수 6.0, 영향 점수 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. OWASP Dependency Check에서 추출한 미국 정부가 운영하는 취약점 데이터베이스(National Vulnerability Database) 데이터에는 CWE에 매핑된 CVE 기록이 약 175,000건(2021년 125,000건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년 241개에서 증가)이다. 추출된 약 220,000건의 CVE 중 160,000건은 CVSS v2 점수를, 156,000건은 CVSS v3 점수를, 6,000건은 CVSS v4 점수를 보유하고 있다. 다수의 CVE가 복수의 점수를 보유하고 있어 합계가 220,000건을 초과한다. -Top 10 2025에서는 다음과 같은 방식으로 평균 Exploit 및 Impact 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 보유한 비율과 CVSSv2 점수를 보유한 나머지 비율에 따라 Exploit 및 Impact 점수에 가중치를 부여하여 전체 평균을 산출하였다. 이 평균값을 데이터셋의 CWE에 매핑하여 위험 산정 공식의 나머지 절반인 Exploit 및 (Technical) Impact 점수로 활용하였다. +Top 10 2025에서는 다음과 같은 방식으로 평균 익스플로잇 및 영향 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화하고, CVSSv3 점수를 보유한 비율과 CVSSv2 점수를 보유한 나머지 비율에 따라 익스플로잇 및 영향 점수에 가중치를 부여하여 전체 평균을 산출하였다. 이 평균값을 데이터셋의 CWE에 매핑하여 위험 산정 공식의 나머지 절반인 익스플로잇 및 (기술적) 영향 점수로 활용하였다. -CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 산정 알고리즘이 근본적으로 변경되어 CVSS v2 및 v3처럼 *Exploit* 또는 *Impact* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수 활용 방안을 모색할 계획이나, 2025년 버전에서는 적절한 시점에 적용할 수 있는 방법을 찾지 못하였다. +CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 산정 알고리즘이 근본적으로 변경되어 CVSS v2 및 v3처럼 *익스플로잇* 또는 *영향* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수 활용 방안을 모색할 계획이나, 2025년 버전에서는 적절한 시점에 적용할 수 있는 방법을 찾지 못하였다. ## 커뮤니티 설문 조사를 사용하는 이유 diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index b72d0d021..d0affe60b 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -32,13 +32,13 @@ 애플리케이션 노출 수준에 따라(환경 기준) - - diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index dbbf03c72..aa31a9dac 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -21,9 +21,9 @@ - - diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index b29a0518b..63b77dd7c 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -20,9 +20,9 @@ - - diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 807df9ba6..0e94bb401 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -23,9 +23,9 @@ - - @@ -100,7 +100,7 @@ * 기본 암호화 대신 항상 인증 암호화(Authenticated Encryption)를 사용한다. * 키는 암호학적으로 무작위로 생성하고, 메모리에 바이트 배열로 저장해야 한다. 패스워드를 암호키로 사용하는 경우 적절한 패스워드 기반 키 파생 함수(PBKDF)를 통해 키로 변환해야 한다. * 적절한 곳에서 암호학적 무작위성이 사용되는지, 그리고 예측 가능하거나 엔트로피가 낮은 방식으로 시드되지 않았는지 확인한다. 대부분의 최신 API는 보안을 위해 개발자가 CSPRNG에 시드를 설정할 필요가 없다. -* MD5, SHA1, CBC(Cipher Block Chaining), PKCS [#1](https://github.com/owasp-kr/Top10/pull/1) v1.5 등 더 이상 사용되지 않는 암호 함수, 블록 빌딩 메서드, 패딩 스키마 사용을 피한다. +* MD5, SHA1, CBC(Cipher Block Chaining), PKCS #1 v1.5 등 더 이상 사용되지 않는 암호 함수, 블록 빌딩 메서드, 패딩 스키마 사용을 피한다. * 보안 전문가, 전용 도구, 또는 둘 다를 활용해 설정과 구성이 보안 요구사항을 충족하는지 검토한다. * 지금부터 양자 내성 암호(PQC)를 준비해야 한다(ENISA 참고). 고위험 시스템은 늦어도 2030년 말까지 안전하게 보호되도록 해야 한다. diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index 3ab70734b..20615e8c5 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -2,7 +2,7 @@ ## 배경 -인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화('크로스 사이트 스크립팅')에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향도가 낮아졌다. +인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화('크로스 사이트 스크립팅')에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향 점수가 낮아졌다. ## 점수표 @@ -19,9 +19,9 @@ - - diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index b6d590af6..cecfb64eb 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -22,9 +22,9 @@ - - diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index 69f2b2391..d5a4e7a0a 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -21,9 +21,9 @@ - - diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index bf1bd6c35..3a6351ef8 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -20,9 +20,9 @@ - - diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index e31463732..c6dfed098 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -21,9 +21,9 @@ - - diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index 465dee32d..d6c39b1a8 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -22,9 +22,9 @@ - - diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index 78e266135..17ba90af0 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -27,9 +27,9 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 - - @@ -171,9 +171,9 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 - - From 54caf3a2d7aaf40c10bc7a599a272f309a5d5ffb Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 21:45:32 +0900 Subject: [PATCH 148/167] bulk modified typos and spaces --- ...025-What_are_Application_Security_Risks.md | 4 ++-- .../docs/ko/A01_2025-Broken_Access_Control.md | 8 ++++---- .../ko/A02_2025-Security_Misconfiguration.md | 8 ++++---- ...A03_2025-Software_Supply_Chain_Failures.md | 8 ++++---- .../ko/A04_2025-Cryptographic_Failures.md | 6 +++--- 2025/docs/ko/A05_2025-Injection.md | 6 +++--- 2025/docs/ko/A06_2025-Insecure_Design.md | 8 ++++---- .../ko/A07_2025-Authentication_Failures.md | 8 ++++---- ...025-Software_or_Data_Integrity_Failures.md | 8 ++++---- ...-Security_Logging_and_Alerting_Failures.md | 10 +++++----- ...5-Mishandling_of_Exceptional_Conditions.md | 14 ++++++------- 2025/docs/ko/X01_2025-Next_Steps.md | 20 +++++++++---------- 12 files changed, 54 insertions(+), 54 deletions(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index d0affe60b..b1eef5ebf 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -83,7 +83,7 @@ Top 10 2025에서는 다음과 같은 방식으로 익스플로잇과 영향의 Top 10 각 카테고리에는 다음과 같은 데이터 요소가 제시되며, 의미는 다음과 같다. -**해당되는 CWE 개수:** Top 10 팀이 해당 카테고리에 매핑한 CWE의 개수. +**해당 CWE 개수:** Top 10 팀이 해당 카테고리에 매핑한 CWE의 개수. **발생률:** 발생률은 해당 연도에 그 조직이 테스트한 모집단에서, 해당 CWE에 취약한 애플리케이션의 비율이다. @@ -91,7 +91,7 @@ Top 10 각 카테고리에는 다음과 같은 데이터 요소가 제시되며, **가중 영향 점수:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**(테스트) 커버리지:** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. +**커버리지:** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. **총 발생 건수:** 카테고리에 매핑된 CWE가 발견된 애플리케이션의 총 개수. diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md index 515534e80..f4cf126d2 100644 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -4,22 +4,22 @@ ## 배경 -불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할 만한 CWE는 *CWE-200: 비인가자에게 민감 정보 노출*, *CWE-201: 전송된 데이터로부터의 민감 정보 노출*, *CWE-918: 서버 측 요청 위조(SSRF)*, 그리고 *CWE-352: 크로스 사이트 요청 위조(CSRF)* 가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. +불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할 만한 CWE는 *CWE-200: 비인가자에게 민감 정보 노출*, *CWE-201: 전송된 데이터로부터의 민감 정보 노출*, *CWE-918: 서버 측 요청 위조(SSRF)*, 그리고 *CWE-352: 크로스 사이트 요청 위조(CSRF)*가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. ## 점수표
- 평균 가중 악용 + 평균 가중 익스플로잇 점수 통제 누락을 평균 발생률로 산정하고 커버리지로 가중 - 평균 가중 영향 + 평균 가중 영향 점수 비즈니스 기준 @@ -56,22 +56,22 @@ 2017년에는 발생률을 기준으로 가능성을 산정하여 카테고리를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성, 탐지 가능성, 기술적 영향을 기준으로 순위를 매겼다. 2021년에는 미국 정부가 운영하는 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. -우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 악용(Exploit) 점수와 영향(Impact) 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. +우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 익스플로잇 점수와 영향 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. -CVSSv2에서는 악용과 (기술적) 영향 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 악용은 60%, 영향은 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 악용 6.0, 영향 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. +CVSSv2에서는 익스플로잇과 (기술적) 영향 점수 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 익스플로잇 점수는 60%, 영향 점수는 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 익스플로잇 점수 6.0, 영향 점수 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. OWASP Dependency-Check에서 추출한 결과, NVD에는 CWE에 매핑된 CVE 레코드가 약 17만 5천 건(2021년의 12만 5천 건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년의 241개에서 증가)이다. 추출된 약 22만 건의 CVE 중 16만 건에는 CVSS v2 점수가, 15만 6천 건에는 CVSS v3 점수가, 6천 건에는 CVSS v4 점수가 있었다. 다수의 CVE가 여러 버전의 점수를 동시에 보유하므로, 점수 건수 합계는 22만 건을 초과한다. -Top 10 2025에서는 다음과 같은 방식으로 악용과 영향의 평균 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화한 뒤, 악용 점수와 영향 점수 모두에 대해 CVSSv3 점수를 보유한 비율과 나머지 CVSSv2 점수 보유 비율을 가중치로 적용하여 전체 평균을 산출하였다. 이렇게 산출한 평균을 데이터셋의 CWE에 매핑하여, 위험 방정식의 나머지 절반에 해당하는 악용 및 기술적 영향 점수로 사용하였다. +Top 10 2025에서는 다음과 같은 방식으로 익스플로잇과 영향의 평균 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화한 뒤, 익스플로잇 점수와 영향 점수 모두에 대해 CVSSv3 점수를 보유한 비율과 나머지 CVSSv2 점수 보유 비율을 가중치로 적용하여 전체 평균을 산출하였다. 이렇게 산출한 평균을 데이터셋의 CWE에 매핑하여, 위험 방정식의 나머지 절반에 해당하는 익스플로잇 및 기술적 영향 점수로 사용하였다. -왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *악용* 또는 *영향* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. +왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *익스플로잇* 또는 *영향* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. 발생률은 일정 기간 동안 조직이 테스트한 애플리케이션 모집단에서, 각 CWE에 취약한 애플리케이션의 비율로 산정하였다. 다시 말해, 우리는 빈도, 즉 한 애플리케이션에서 문제가 몇 번 발견되는지는 사용하지 않는다. 관심 대상은 애플리케이션 모집단 중 각 CWE가 발견된 애플리케이션의 비율이다. 커버리지는 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율로 산정한다. 커버리지가 높을수록 표본 크기가 모집단을 더 잘 대표하므로, 산정된 발생률이 정확하다는 보증 수준이 더 강해진다. 이번 버전에서 사용한 공식은 2021년과 유사하되, 일부 가중치가 변경되었다. -(최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 +(최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 익스플로잇 점수 * 10) + (평균 영향 점수 * 20) + (발생 건수 합 / 10000) = 위험 점수 산정된 점수는 불충분한 접근 제어 카테고리에서 621.60으로 가장 높았고, 메모리 관리 실패 카테고리에서 271.08로 가장 낮았다. @@ -87,9 +87,9 @@ Top 10 각 카테고리에는 다음과 같은 데이터 요소가 제시되며, **발생률:** 발생률은 해당 연도에 그 조직이 테스트한 모집단에서, 해당 CWE에 취약한 애플리케이션의 비율이다. -**가중 악용도:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 악용 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. +**가중 익스플로잇 점수:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 익스플로잇 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**가중 영향도:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. +**가중 영향 점수:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. **(테스트) 커버리지:** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. @@ -97,4 +97,4 @@ Top 10 각 카테고리에는 다음과 같은 데이터 요소가 제시되며, **총 CVE 건수:** 해당 카테고리에 매핑된 CWE에 매핑된 NVD DB 내 CVE의 총 개수. -**공식:** (최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 악용 * 10) + (평균 영향 * 20) + (발생 건수 합 / 10000) = 위험 점수 +**공식:** (최대 발생률 % * 1000) + (최대 커버리지 % * 100) + (평균 익스플로잇 점수 * 10) + (평균 영향 점수 * 20) + (발생 건수 합 / 10000) = 위험 점수 diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md index cf6353912..515534e80 100644 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -21,9 +21,9 @@ 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수 평균 테스트 커버리지 평균 가중 악용도 + 평균 가중 익스플로잇 점수 평균 가중 영향도 + 평균 가중 영향 점수 총 발생 건수
- - - diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index aa31a9dac..7b8949dc0 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -3,7 +3,7 @@ ## 배경 -지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트 된 모든 애플리케이션에서 잘못된 설정 중 한 가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3%이며, 총 CWE는 1,375개이고 71만 9천 개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할 만한 CWE로는 *CWE-16: 설정* 그리고 *CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)*가 있다. +지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트 된 모든 애플리케이션에서 잘못된 설정 중 한 가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3%이며, 총 CWE는 1, 375개이고 71만 9천 개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할 만한 CWE로는 *CWE-16: 설정* 그리고 *CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)*가 있다. ## 점수표 @@ -11,15 +11,15 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index 63b77dd7c..5af950dcd 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -3,22 +3,22 @@ ## 배경 -소프트웨어 공급망 실패는 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정하였다. 2013년 TOP 10에 "A9 - 사용 중인 컴포넌트 내 알려진 취약점" 으로 처음 등장한 이후, 해당 카테고리는 "알려진 취약점" 외에도 "모든 공급망 실패"를 포함하도록 범위가 확장되었다. 범위가 확대됨에도 불구하고, 공급망 실패는 여전히 식별이 어려우며, 관련 CWE와 매핑된 CVE가 11개에 불과하다. 그러나, 수집한 데이터를 테스트하고 보고한 결과에 따르면 이번 카테고리는 5.19%라는 가장 높은 평균 발생률을 보였고, 관련된 CWE로는 *CWE-477: 더 이상 사용되지 않는 기능 사용*, *CWE-1104: 관리되지 않은 외부 컴포넌트 사용*, *CWE-1329: 업데이트할 수 없는 컴포넌트에 대한 의존*, 그리고 *CWE-1395: 취약한 외부 컴포넌트 의존* 이 있다. +소프트웨어 공급망 실패는 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정하였다. 2013년 TOP 10에 "A9 - 사용 중인 컴포넌트 내 알려진 취약점" 으로 처음 등장한 이후, 해당 카테고리는 "알려진 취약점" 외에도 "모든 공급망 실패"를 포함하도록 범위가 확장되었다. 범위가 확대됨에도 불구하고, 공급망 실패는 여전히 식별이 어려우며, 관련 CWE와 매핑된 CVE가 11개에 불과하다. 그러나, 수집한 데이터를 테스트하고 보고한 결과에 따르면 이번 카테고리는 5.19%라는 가장 높은 평균 발생률을 보였고, 관련된 CWE로는 *CWE-477: 더 이상 사용되지 않는 기능 사용*, *CWE-1104: 관리되지 않은 외부 컴포넌트 사용*, *CWE-1329: 업데이트할 수 없는 컴포넌트에 대한 의존*, 그리고 *CWE-1395: 취약한 외부 컴포넌트 의존*이 있다. ## 점수표
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 0e94bb401..905b53b57 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -13,15 +13,15 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index 20615e8c5..6936eb68b 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -9,15 +9,15 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index cecfb64eb..50a8c3a87 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -3,7 +3,7 @@ ## 배경 -안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들면, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, 설계상 안전(Secure by Design, SbD)의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269 권한 관리 오류, CWE-434 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. +안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들어, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, 설계상 안전(Secure by Design, SbD)의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269: 권한 관리 오류, CWE-434: 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. @@ -12,15 +12,15 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index d5a4e7a0a..9a5ff0edd 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -3,7 +3,7 @@ ## 배경 -인증 실패는 동일하게 7위를 유지하고 있으며, 해당 카테고리에 해당되는 36개의 CWE를 보다 정확하게 반영하기 위해 명칭을 약간 변경했다. 표준화된 프레임워크로부터의 이점에도 불구하고, 이 카테고리는 2021년부터 7위를 유지해 왔다. 대표적인 CWE로는 *CWE-259 하드코딩된 비밀번호 사용*, *CWE-297: 호스트 불일치 상황에서의 인증서 검증 미흡*, *CWE-287: 부적절한 인증*, *CWE-384: 세션 고정(Session Fixation)*, 그리고 *CWE-798 하드코딩된 자격 증명 사용*이 포함된다. +인증 실패는 동일하게 7위를 유지하고 있으며, 해당 카테고리에 해당되는 36개의 CWE를 보다 정확하게 반영하기 위해 명칭을 약간 변경했다. 표준화된 프레임워크로부터의 이점에도 불구하고, 이 카테고리는 2021년부터 7위를 유지해 왔다. 대표적인 CWE로는 *CWE-259: 하드코딩된 비밀번호 사용*, *CWE-297: 호스트 불일치 상황에서의 인증서 검증 미흡*, *CWE-287: 부적절한 인증*, *CWE-384: 세션 고정(Session Fixation)*, 그리고 *CWE-798: 하드코딩된 자격 증명 사용*이 포함된다. ## 점수표 @@ -11,15 +11,15 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index 3a6351ef8..433a59d1f 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -2,7 +2,7 @@ ## 배경 -소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 *및* 데이터 무결성 실패"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 해당 카테고리는 소프트웨어 공급망 실패보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 CWE로는 *CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함*, *CWE-915: 동적-결정 객체 속성의 부적절하게 통제된 수정*, *CWE-502: 신뢰할 수 없는 데이터의 역직렬화*가 있다. +소프트웨어 또는 데이터 무결성 실패는 8위를 유지했으며, "소프트웨어 *및* 데이터 무결성 실패"에서 약간의 명확화를 위해 명칭이 소폭 변경되었다. 해당 카테고리는 소프트웨어 공급망 실패보다 더 하위 수준에서, 신뢰 경계를 유지하지 못하고 소프트웨어, 코드, 데이터 아티팩트의 무결성을 검증하지 못하는 문제에 초점을 둔다. 즉, 무결성을 확인하지 않은 채 소프트웨어 업데이트와 중요 데이터에 대해 가정하는 행위를 다룬다. 대표적인 CWE로는 *CWE-829: 신뢰할 수 없는 통제 영역에서 기능 포함*, *CWE-915: 동적 결정 객체 속성의 부적절하게 통제된 수정*, *CWE-502: 신뢰할 수 없는 데이터의 역직렬화*가 있다. ## 점수표 @@ -10,15 +10,15 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index c6dfed098..7dc5d5b19 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -3,7 +3,7 @@ ## 배경 -보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *로그 기록 시 출력 인코딩 처리 미흡(CWE-117), 로그에 민감 정보 기록(CWE-532), 그리고 불충분한 로깅(CWE-778)이다.* +보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *CWE-117: 로그 기록 시 출력 인코딩 처리 미흡, CWE-532: 로그에 민감 정보 기록, 그리고 CWE-778: 불충분한 로깅*이다. ## 점수표 @@ -11,15 +11,15 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - @@ -100,7 +100,7 @@ **시나리오 2:** 인도의 주요 항공사에서 여권 및 신용카드 데이터를 포함해 수백만 명 승객의 10년 이상 분량 개인정보가 유출되었다. 해당 유출은 제3자 클라우드 호스팅 제공업체에서 발생했으며, 해당 제공업체는 일정 시간이 지난 뒤에야 항공사에 침해 사실을 통보했다. -**사나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취되었다. 그 결과 항공사는 개인정보 감독기관으로부터 2,000만 파운드의 벌금을 부과받았다. +**시나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취되었다. 그 결과 항공사는 개인정보 감독기관으로부터 2, 000만 파운드의 벌금을 부과받았다. ## 참조 diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index d6c39b1a8..edd2b7fb0 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -12,15 +12,15 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - @@ -59,13 +59,13 @@ 부적절한 예외 처리는 프로그램이 비정상적이고 예측 불가능한 상황을 예방, 탐지, 대응하지 못할 때 발생하며, 이로 인해 시스템 충돌, 예상치 못한 동작, 때로는 보안 취약점까지 초래할 수 있다. 이는 다음 세 가지 실패 중 하나 이상을 포함한다. 비정상적인 상황을 사전에 예방하지 못하거나, 발생 시 이를 식별하지 못하거나, 발생 후 적절히 대응하지 못하는 경우다. -예외 상황은 다음과 같은 원인으로 발생할 수 있다. 누락되거나 불완전한 입력 검증, 발생 지점이 아닌 상위 레벨에서의 지연된 오류 처리, 메모리,권한,네트워크 문제 등 예기치 않은 환경 상태, 일관성 없는 예외 처리, 또는 전혀 처리되지 않는 예외로 인해 시스템이 알 수 없고 예측 불가능한 상태에 빠지는 경우다. 애플리케이션이 다음에 무엇을 해야 할지 알 수 없는 상태에 빠진다면, 예외 처리가 실패한 것이다. 이러한 오류와 예외는 발견이 어려워 장기간 보안을 위협할 수 있다. +예외 상황은 다음과 같은 원인으로 발생할 수 있다. 누락되거나 불완전한 입력 검증, 발생 지점이 아닌 상위 레벨에서의 지연된 오류 처리, 메모리, 권한, 네트워크 문제 등 예기치 않은 환경 상태, 일관성 없는 예외 처리, 또는 전혀 처리되지 않는 예외로 인해 시스템이 알 수 없고 예측 불가능한 상태에 빠지는 경우다. 애플리케이션이 다음에 무엇을 해야 할지 알 수 없는 상태에 빠진다면, 예외 처리가 실패한 것이다. 이러한 오류와 예외는 발견이 어려워 장기간 보안을 위협할 수 있다. 부적절한 예외 처리로 인해 다양한 보안 취약점이 발생할 수 있다. 예를 들어 논리 버그, 오버플로우, 레이스 컨디션, 부정 거래, 메모리, 상태, 리소스, 타이밍, 인증, 인가 관련 문제 등이 있다. 이러한 유형의 취약점은 시스템 또는 데이터의 기밀성, 가용성, 무결성에 부정적인 영향을 미칠 수 있다. 공격자는 애플리케이션의 결함 있는 오류 처리를 악용하여 이 취약점을 공격한다. ## 대응 방안 -예외 상황을 적절히 처리하려면 이러한 상황에 대비한 계획을 세워야 한다(최악의 상황을 예상하라). 모든 시스템 오류를 발생 지점에서 직접 캐치(catch)하고, 이를 처리해야 한다. 여기서 처리란 문제 해결을 위한 의미 있는 조치를 취하고 정상 상태로 복구하는 것을 의미한다. 처리 과정에는 오류 발생 시 사용자에게 이해하기 쉬운 방식으로 알리고, 이벤트를 로깅하며, 필요하다고 판단되면 알림을 발송하는 것이 포함되어야 한다. 또한 놓친 예외가 있을 경우를 대비해 전역 예외 핸들러(Global Exception Handler)를 구현해야 한다. 이상적으로는 반복되는 오류나 진행 중인 공격을 나타내는 패턴을 감시하고, 이에 대응,방어,차단할 수 있는 모니터링 또는 옵저버빌리티 도구를 갖추는 것이 좋다. 이를 통해 오류 처리 취약점을 악용하는 스크립트와 봇에 대응하고 차단할 수 있다. +예외 상황을 적절히 처리하려면 이러한 상황에 대비한 계획을 세워야 한다(최악의 상황을 예상하라). 모든 시스템 오류를 발생 지점에서 직접 캐치(catch)하고, 이를 처리해야 한다. 여기서 처리란 문제 해결을 위한 의미 있는 조치를 취하고 정상 상태로 복구하는 것을 의미한다. 처리 과정에는 오류 발생 시 사용자에게 이해하기 쉬운 방식으로 알리고, 이벤트를 로깅하며, 필요하다고 판단되면 알림을 발송하는 것이 포함되어야 한다. 또한 놓친 예외가 있을 경우를 대비해 전역 예외 핸들러(Global Exception Handler)를 구현해야 한다. 이상적으로는 반복되는 오류나 진행 중인 공격을 나타내는 패턴을 감시하고, 이에 대응, 방어, 차단할 수 있는 모니터링 또는 옵저버빌리티 도구를 갖추는 것이 좋다. 이를 통해 오류 처리 취약점을 악용하는 스크립트와 봇에 대응하고 차단할 수 있다. 예외 상황을 캐치하고 처리하면 프로그램의 기반 인프라가 예측 불가능한 상황에 노출되는 것을 방지할 수 있다. 트랜잭션 처리 도중이라면, 트랜잭션의 모든 부분을 롤백하고 처음부터 다시 시작하는 것이 매우 중요하다(이를 fail closed라고 한다). 트랜잭션을 중간 상태에서 복구하려는 시도는 종종 복구 불가능한 오류를 만들어낸다. @@ -73,7 +73,7 @@ 특정 빈도 이상으로 동일한 오류가 반복될 경우, 개별 오류 메시지 대신 발생 횟수와 시간대를 보여주는 통계 형태로 출력하는 것을 고려하라. 이 정보는 자동화된 로깅 및 모니터링을 방해하지 않도록 원본 메시지에 추가하는 방식으로 처리해야 한다. [A09:2025 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)를 참고하라. -이 외에도 다음 사항을 포함해야 한다. 엄격한 입력 검증(허용해야 하는 위험 문자에 대한 새니타이징 또는 이스케이프 처리 포함), *중앙 집중화된* 오류 처리,로깅,모니터링,알림 체계, 그리고 전역 예외 핸들러다. 하나의 애플리케이션에서 예외 처리를 위한 여러 함수를 두어서는 안 되며, 한 곳에서 동일한 방식으로 처리해야 한다. 또한 이 섹션의 모든 권고 사항에 대해 프로젝트 보안 요구사항을 수립하고, 설계 단계에서 위협 모델링 또는 보안 설계 검토를 수행하며, 코드 리뷰나 정적 분석을 실시하고, 최종 시스템에 대해 스트레스, 성능, 침투 테스트를 수행해야 한다. +이 외에도 다음 사항을 포함해야 한다. 엄격한 입력 검증(허용해야 하는 위험 문자에 대한 새니타이징 또는 이스케이프 처리 포함), *중앙 집중화된* 오류 처리, 로깅, 모니터링, 알림 체계, 그리고 전역 예외 핸들러다. 하나의 애플리케이션에서 예외 처리를 위한 여러 함수를 두어서는 안 되며, 한 곳에서 동일한 방식으로 처리해야 한다. 또한 이 섹션의 모든 권고 사항에 대해 프로젝트 보안 요구사항을 수립하고, 설계 단계에서 위협 모델링 또는 보안 설계 검토를 수행하며, 코드 리뷰나 정적 분석을 실시하고, 최종 시스템에 대해 스트레스, 성능, 침투 테스트를 수행해야 한다. 가능하다면 조직 전체가 동일한 방식으로 예외 상황을 처리하는 것이 좋다. 이렇게 하면 이 중요한 보안 통제에 대한 코드 리뷰와 감사가 더 쉬워진다. @@ -83,7 +83,7 @@ **시나리오 2:** 데이터베이스 오류가 사용자에게 그대로 노출되면 민감한 시스템 정보가 유출된다. 공격자는 이를 악용해 의도적으로 오류를 유발하고, 수집한 정보를 기반으로 더 정교한 SQL 인젝션 공격을 구성할 수 있다. -**시나리오 3:** 공격자가 네트워크 장애를 일으켜 여러 단계로 이루어진 트랜젝션을 중간에 방해할 수 있다. 예를 들어 트랜잭션이 사용자 계좌 출금, 대상 계좌 입금, 트랜잭션 로깅 순서로 처리된다고 가정한다면, 중간에 오류가 발생해도 시스템이 전체를 롤백(안전한 실패)하지 않으할 문제가 생긴다. 공격자는 이를 악용해 사용자 계좌에서 돈만 빠져나가게 하거나, 레이스 컨디션을 이용해 대상 계좌로 여러 번 송금할 수 있다. +**시나리오 3:** 공격자가 네트워크 장애를 일으켜 여러 단계로 이루어진 트랜잭션을 중간에 방해할 수 있다. 예를 들어 트랜잭션이 사용자 계좌 출금, 대상 계좌 입금, 트랜잭션 로깅 순서로 처리된다고 가정한다면, 중간에 오류가 발생해도 시스템이 전체를 롤백(안전한 실패)하지 않으면 문제가 생긴다. 공격자는 이를 악용해 사용자 계좌에서 돈만 빠져나가게 하거나, 레이스 컨디션을 이용해 대상 계좌로 여러 번 송금할 수 있다. ## 참조 diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index 17ba90af0..d20692efe 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -9,7 +9,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 ### 배경 -이 카테고리의 명칭은 2021년 버전의 서비스 거부(Denial of Service)에서 현재 명칭으로 변경됐다. 기존 명칭은 근본 원인보다는 발생 현상을 설명하는 성격이 강해, 이를 보완하기 위해 재명명되었다. 이 카테고리는 복원력과 관련된 약점을 설명하는 CWE에 초점을 둔다. 점수 산정은 A10:2025-부적절한 예외 처리와 매우 근접했다. 관련된 CWE로는 *CWE-400 통제되지 않은 자원 소비, CWE-409 고압축 데이터의 부적절한 처리(데이터 증폭), CWE-674 통제되지 않은 재귀*, 그리고 *CWE-835 종료 조건에 도달할 수 없는 루프(무한 루프).*가 있다. +이 카테고리의 명칭은 2021년 버전의 서비스 거부(Denial of Service)에서 현재 명칭으로 변경됐다. 기존 명칭은 근본 원인보다는 발생 현상을 설명하는 성격이 강해, 이를 보완하기 위해 재명명되었다. 이 카테고리는 복원력과 관련된 약점을 설명하는 CWE에 초점을 둔다. 점수 산정은 A10:2025-부적절한 예외 처리와 매우 근접했다. 관련된 CWE로는 *CWE-400: 통제되지 않은 자원 소비, CWE-409: 고압축 데이터의 부적절한 처리(데이터 증폭), CWE-674: 통제되지 않은 재귀*, 그리고 *CWE-835: 종료 조건에 도달할 수 없는 루프(무한 루프)*가 있다. ### 점수표 @@ -17,15 +17,15 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - @@ -66,7 +66,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 또한 [X02:2025 메모리 관리 실패](#x022025-memory-management-failures) 역시 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있다. -### 대응방안. +### 대응 방안 이 유형의 취약점을 예방하기 위해서는 시스템의 장애와 복구를 기본 전제로 설계해야 한다. @@ -161,15 +161,15 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
- - - @@ -248,11 +248,11 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 **시나리오 1:** 버퍼 오버플로는 가장 유명한 메모리 취약점으로, 공격자가 필드가 수용할 수 있는 것보다 더 많은 데이터를 입력하여 해당 변수에 대해 생성된 버퍼를 넘치게 만드는 상황을 말한다. 공격이 성공하면 넘친 데이터가 스택 포인터를 덮어쓰게 되며, 이를 통해 공격자가 프로그램에 악의적인 명령을 삽입할 수 있게 된다. -**시나리오 2:** 유즈 에프터 프리(Use-After-Free)은 비교적 자주 발생하여 브라우저 버그 바운티에서 흔히 제보되는 제보되는 유형의 버그다. 예를 들어 웹 브라우저가 DOM 요소를 조작하는 JavaScript를 처리하는 상황을 가정하자. 공격자는 객체(예: DOM 요소)를 생성하고 그에 대한 참조를 획득하는 JavaScript 페이로드를 작성한다. 이후 정교한 조작을 통해, 브라우저가 해당 객체의 메모리를 해제하도록 유도하면서도 그 객체를 가리키는 댕글링 포인터(dangling pointer)는 유지하게 만든다. 브라우저가 메모리 해제를 인지하기 전에, 공격자는 *동일한* 메모리 공간을 차지하도록 새 객체를 할당한다. 브라우저가 원래 포인터를 사용하면, 이제 그 포인터는 공격자가 삽입한 데이터를 참조하게 된다. 만약 이 포인터가 가상 함수 테이블을 가리키는 것이었다면, 공격자는 코드 실행 흐름을 자신의 페이로드로 리다이렉션할 수 있다. +**시나리오 2:** 유즈 에프터 프리(Use-After-Free)은 비교적 자주 발생하여 브라우저 버그 바운티에서 흔히 제보되는 유형의 버그다. 예를 들어 웹 브라우저가 DOM 요소를 조작하는 JavaScript를 처리하는 상황을 가정하자. 공격자는 객체(예: DOM 요소)를 생성하고 그에 대한 참조를 획득하는 JavaScript 페이로드를 작성한다. 이후 정교한 조작을 통해, 브라우저가 해당 객체의 메모리를 해제하도록 유도하면서도 그 객체를 가리키는 댕글링 포인터(dangling pointer)는 유지하게 만든다. 브라우저가 메모리 해제를 인지하기 전에, 공격자는 *동일한* 메모리 공간을 차지하도록 새 객체를 할당한다. 브라우저가 원래 포인터를 사용하면, 이제 그 포인터는 공격자가 삽입한 데이터를 참조하게 된다. 만약 이 포인터가 가상 함수 테이블을 가리키는 것이었다면, 공격자는 코드 실행 흐름을 자신의 페이로드로 리다이렉션할 수 있다. **시나리오 3:** 사용자 입력을 받아 적절히 검증하거나 정제하지 않고 로깅 함수로 직접 전달하는 네트워크 서비스를 가정해 보자. 사용자 입력은 형식을 지정하는 syslog("%s", user_input) 대신 형식을 지정하지 않은 syslog(user_input) 형태로 로깅 함수에 전달된다. 공격자는 스택 메모리를 읽기 위한(민감한 데이터 노출) %x 또는 메모리 주소에 값을 쓰기 위한 %n과 같은 형식 지정자(format specifier)를 포함한 악성 페이로드를 전송한다. 공격자는 여러 형식 지정자를 결합하여 스택 구조를 파악하고, 중요한 주소를 찾아낸 뒤 이를 덮어쓸 수 있다. 이는 포맷 스트링 취약점(format string vulnerability)에 해당한다. -참고: 현대의 브라우저는 [브라우저 샌드박스](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing), ASLR, DEP/NX, RELRO 및 PIE를 를 포함한 심층적 방어 체계를 사용하기에, 브라우저에 대한 메모리 관리 실패 공격이 쉽지 않다. +참고: 현대의 브라우저는 [브라우저 샌드박스](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing), ASLR, DEP/NX, RELRO 및 PIE를 포함한 심층적 방어 체계를 사용하기에, 브라우저에 대한 메모리 관리 실패 공격이 쉽지 않다. ### 참조 From bf7893eacba56540435a645acb71b845a577678e Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 21:49:16 +0900 Subject: [PATCH 149/167] spaces --- 2025/docs/ko/A02_2025-Security_Misconfiguration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index 7b8949dc0..413e106aa 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -3,7 +3,7 @@ ## 배경 -지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트 된 모든 애플리케이션에서 잘못된 설정 중 한 가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3%이며, 총 CWE는 1, 375개이고 71만 9천 개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할 만한 CWE로는 *CWE-16: 설정* 그리고 *CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)*가 있다. +지난 버전에서 3단계 상승해 2위로 올라왔으며, 테스트 된 모든 애플리케이션에서 잘못된 설정 중 한 가지 이상이 발견되었다. 이번 카테고리 내에서의 평균 발생률은 3%이며, 총 CWE는 1,375개이고 71만 9천 개가 넘는 취약점이 발견되었다. 최근 설정 가능한 소프트웨어 쪽으로 트렌드가 이동함에 따라 이번 카테고리 순위 변동은 크게 놀라울 만한 일이 아니다. 주목할 만한 CWE로는 *CWE-16: 설정* 그리고 *CWE-611: XML 외부 엔티티 참조의 부적절한 제한(XXE)*가 있다. ## 점수표 From 1b740f084eab5afcf08b4a15e8c023d1121ac29f Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 21:53:21 +0900 Subject: [PATCH 150/167] modify space --- 2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index 7dc5d5b19..861bb271c 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -100,7 +100,7 @@ **시나리오 2:** 인도의 주요 항공사에서 여권 및 신용카드 데이터를 포함해 수백만 명 승객의 10년 이상 분량 개인정보가 유출되었다. 해당 유출은 제3자 클라우드 호스팅 제공업체에서 발생했으며, 해당 제공업체는 일정 시간이 지난 뒤에야 항공사에 침해 사실을 통보했다. -**시나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취되었다. 그 결과 항공사는 개인정보 감독기관으로부터 2, 000만 파운드의 벌금을 부과받았다. +**시나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취되었다. 그 결과 항공사는 개인정보 감독기관으로부터 2,000만 파운드의 벌금을 부과받았다. ## 참조 From 3ec7f2f45bce514e8eee8931a7fb1217e083d597 Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 22:00:10 +0900 Subject: [PATCH 151/167] Unify verb endings to descriptive style in Korean docs --- ...tablishing_a_Modern_Application_Security_Program.md | 6 +++--- .../docs/ko/A03_2025-Software_Supply_Chain_Failures.md | 2 +- 2025/docs/ko/A04_2025-Cryptographic_Failures.md | 2 +- 2025/docs/ko/A06_2025-Insecure_Design.md | 10 +++++----- .../A10_2025-Mishandling_of_Exceptional_Conditions.md | 4 ++-- 2025/docs/ko/index.md | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index dc0af39b4..eda6dc82c 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -4,11 +4,11 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 -이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려하라. 해당 모델들은 포괄적이며 세부 항목까지 빠짐없이 다루고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야 좋은 보안 체계라고 할 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. +이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려한다. 해당 모델들은 포괄적이며 세부 항목까지 빠짐없이 다루고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야 좋은 보안 체계라고 할 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. -애플리케이션 보안 체계를 처음 구축하는 단계이거나, 현재 팀의 상황에서 OWASP SAMM 또는 DSOMM가 과도하다고 느껴진다면, 아래 내용을 참고하라. +애플리케이션 보안 체계를 처음 구축하는 단계이거나, 현재 팀의 상황에서 OWASP SAMM 또는 DSOMM가 과도하다고 느껴진다면, 아래 내용을 참고한다. ### 1. 위험 기반 포트폴리오 관리 체계 수립 @@ -57,7 +57,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 ### 5. 운영 가시성 확보 -* 지표를 기반으로 관리하라. 수집된 지표 및 분석 데이터를 기반으로 개선 활동과 예산 의사결정을 추진한다. 지표로는 보안 관행 및 활동 준수, 신규 취약점 유입, 취약점 조치, 테스트된 애플리케이션 범위, 결함 유형별 밀도 및 발생 건수 등이 있다. +* 지표를 기반으로 관리한다. 수집된 지표 및 분석 데이터를 기반으로 개선 활동과 예산 의사결정을 추진한다. 지표로는 보안 관행 및 활동 준수, 신규 취약점 유입, 취약점 조치, 테스트된 애플리케이션 범위, 결함 유형별 밀도 및 발생 건수 등이 있다. * 구현 및 검증 활동에서 축적된 데이터를 분석하여, 근본 원인과 취약점 패턴을 식별하고, 전사 차원의 전략 및 시스템적 개선을 추진한다. 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공한다. diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index 5af950dcd..c45d18864 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -101,7 +101,7 @@ * 컨테이너 레지스트리 -다음과 같은 시스템을 하드닝하라. 하드닝에는 MFA를 활성화하고 IAM의 권한을 제한하는 조치가 포함된다. +다음과 같은 시스템을 하드닝한다. 하드닝에는 MFA를 활성화하고 IAM의 권한을 제한하는 조치가 포함된다. * 코드 저장소: 시크릿 커밋 금지, 브랜치 보호, 백업 설정 * 개발자 워크스테이션: 주기적 패치, 다중 인증(MFA), 모니터링 등 diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 905b53b57..dbfa4cf40 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -81,7 +81,7 @@ ## 대응 방안 -최소한 다음 사항들을 수행하고 레퍼런스를 참고하라. +최소한 다음 사항들을 수행하고 레퍼런스를 참고한다. diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 50a8c3a87..90fd2ea7b 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -3,7 +3,7 @@ ## 배경 -안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들어, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, 설계상 안전(Secure by Design, SbD)의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고하라. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269: 권한 관리 오류, CWE-434: 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. +안전하지 않은 설계는 **[A02:2025-보안 설정 오류](A02_2025-Security_Misconfiguration.md)**와 **[A03:2025-소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**가 이를 추월함에 따라, 순위에서 4위에서 6위로 두 칸 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계 전반에서 위협 모델링의 적용이 확대되고 보안 설계에 대한 강조가 강화되는 등 눈에 띄는 개선이 관찰되었다. 이 카테고리는 설계 및 아키텍처 결함과 관련된 위험에 초점을 맞추며, 더 많은 위협 모델링, 안전한 설계 패턴, 그리고 레퍼런스 아키텍처 사용을 요구한다. 이 카테고리에는 비즈니스 로직 취약점도 포함된다. 예를 들어, 애플리케이션이 가질 수 있는 단계(상태)와 각 단계가 서로 바뀔 수 있는 조건을 명확히 정의하지 않으면, 예상치 못한 변경을 유도하여 시스템을 공격할 수 있다. 커뮤니티 차원에서 코딩 단계의 "시프트-레프트(shift-left)"에 머무르지 않고, 설계상 안전(Secure by Design, SbD)의 원칙에 중요하게 기여하는 코딩 이전의 활동(예: 요구사항 작성 및 애플리케이션 설계)까지 확장해야 한다. 이를 위해 **[현대적 애플리케이션 보안 체계 수립: 기획 및 설계 단계](0x03_2025-Establishing_a_Modern_Application_Security_Program.md)**를 참고한다. 대표적인 CWE로는 *CWE-256: 자격 증명 저장 보호 미흡, CWE-269: 권한 관리 오류, CWE-434: 위험한 파일 형식 업로드 제한 미흡, CWE-501: 신뢰 경계 위반, 그리고 CWE-522: 자격 증명 보호 불충분*이 있다. @@ -68,19 +68,19 @@ ### 요구사항 수집 및 리소스 관리 -비즈니스 부서와 협업하여 애플리케이션의 비즈니스 요구사항을 수집 및 조율하며, 모든 데이터 자산과 예상되는 비즈니스 로직에 대해 기밀성, 무결성, 가용성, 인증성 관점의 보호 요구사항을 함께 정의한다. 애플리케이션의 대외 노출 수준을 고려하고, 그리고 단순 접근 제어 수준을 넘어서는 테넌트 격리가 필요한지 아닌지를 고려하라. 기능 요구사항뿐 아니라 비기능 보안 요구사항까지 포함해 기술 요구사항을 정리한다. 또한, 보안 활동을 포함한 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의하라. +비즈니스 부서와 협업하여 애플리케이션의 비즈니스 요구사항을 수집 및 조율하며, 모든 데이터 자산과 예상되는 비즈니스 로직에 대해 기밀성, 무결성, 가용성, 인증성 관점의 보호 요구사항을 함께 정의한다. 애플리케이션의 대외 노출 수준을 고려하고, 그리고 단순 접근 제어 수준을 넘어서는 테넌트 격리가 필요한지 아닌지를 고려한다. 기능 요구사항뿐 아니라 비기능 보안 요구사항까지 포함해 기술 요구사항을 정리한다. 또한, 보안 활동을 포함한 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의한다. ### 안전한 설계 -안전한 설계는 지속적으로 위협을 평가하고, 알려진 공격 기법을 방지하기 위해 코드가 견고하게 설계되고 테스트 되도록 보장하는 문화이자 방법론이다. 위협 모델링은 요구사항 개선 단계(혹은 유사한 활동)에 내재화되어야 하며, 이 과정에서 데이터 흐름과 접근 제어 또는 기타 보안 통제의 변화를 중심으로 검토해야 한다. 유저 스토리를 작성할 때 정상 흐름과 실패 흐름을 결정하고, 책임 당사자 및 영향받는 당사자가 이를 충분히 이해하고 합의했는지 확인하라. 또한 정상과 실패 흐름에 대한 가정과 조건을 분석하여 정확하고 바람직한 상태로 유지되는지 확인하라. 올바른 동작을 위해 필요한 가정과 조건을 어떻게 검증하고 강제할지 결정한다. 이 결과는 유저 스토리에 문서화되어야 한다. 과정 중에 발생하는 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공하라. 마지막으로, 안전한 설계는 개발이 완료된 이후에 추가할 수 있는 부가 기능도 아니고 도구도 아니다. +안전한 설계는 지속적으로 위협을 평가하고, 알려진 공격 기법을 방지하기 위해 코드가 견고하게 설계되고 테스트 되도록 보장하는 문화이자 방법론이다. 위협 모델링은 요구사항 개선 단계(혹은 유사한 활동)에 내재화되어야 하며, 이 과정에서 데이터 흐름과 접근 제어 또는 기타 보안 통제의 변화를 중심으로 검토해야 한다. 유저 스토리를 작성할 때 정상 흐름과 실패 흐름을 결정하고, 책임 당사자 및 영향받는 당사자가 이를 충분히 이해하고 합의했는지 확인한다. 또한 정상과 실패 흐름에 대한 가정과 조건을 분석하여 정확하고 바람직한 상태로 유지되는지 확인한다. 올바른 동작을 위해 필요한 가정과 조건을 어떻게 검증하고 강제할지 결정한다. 이 결과는 유저 스토리에 문서화되어야 한다. 과정 중에 발생하는 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공한다. 마지막으로, 안전한 설계는 개발이 완료된 이후에 추가할 수 있는 부가 기능도 아니고 도구도 아니다. ### 보안 개발 생명 주기 -안전한 소프트웨어에는 보안 개발 생명 주기, 안전한 설계 패턴, 포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것) 방법론, 안전한 컴포넌트 라이브러리, 적절한 도구, 위협 모델링, 그리고 프로세스를 개선하기 위해 사용되는 사고 포스트모템(post-mortem)이 필요하다. 소프트웨어 프로젝트 초기부터 보안 전문가와 협업하고, 개발 전체 과정 및 소프트웨어 유지보수 단계에서도 지속적으로 협업해야 한다. 보안 개발 활동을 체계화하기 위해 [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owaspsamm.org/)와 같은 성숙도 모델을 참고하는 방안을 고려하라. +안전한 소프트웨어에는 보안 개발 생명 주기, 안전한 설계 패턴, 포장된 도로(가장 쉽고 선호되는 방법이 동시에 가장 안전한 방법이 되도록 하는 것) 방법론, 안전한 컴포넌트 라이브러리, 적절한 도구, 위협 모델링, 그리고 프로세스를 개선하기 위해 사용되는 사고 포스트모템(post-mortem)이 필요하다. 소프트웨어 프로젝트 초기부터 보안 전문가와 협업하고, 개발 전체 과정 및 소프트웨어 유지보수 단계에서도 지속적으로 협업해야 한다. 보안 개발 활동을 체계화하기 위해 [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owaspsamm.org/)와 같은 성숙도 모델을 참고하는 방안을 고려한다. -개발자가 보안에 대해 주도적으로 책임져야 한다는 인식이 종종 부족하다. 보안 인식과 책임감을 강화하고, 위험을 사전에 완화하려는 문화를 조성하라. 보안에 관한 정기적인 교류(예: 위협 모델링 세션 도중)는 모든 중요한 설계 의사결정에 보안을 포함시키기 위한 마인드셋을 형성할 수 있다. +개발자가 보안에 대해 주도적으로 책임져야 한다는 인식이 종종 부족하다. 보안 인식과 책임감을 강화하고, 위험을 사전에 완화하려는 문화를 조성한다. 보안에 관한 정기적인 교류(예: 위협 모델링 세션 도중)는 모든 중요한 설계 의사결정에 보안을 포함시키기 위한 마인드셋을 형성할 수 있다. ## 대응 방안 diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index edd2b7fb0..1e51d0a33 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -69,9 +69,9 @@ 예외 상황을 캐치하고 처리하면 프로그램의 기반 인프라가 예측 불가능한 상황에 노출되는 것을 방지할 수 있다. 트랜잭션 처리 도중이라면, 트랜잭션의 모든 부분을 롤백하고 처음부터 다시 시작하는 것이 매우 중요하다(이를 fail closed라고 한다). 트랜잭션을 중간 상태에서 복구하려는 시도는 종종 복구 불가능한 오류를 만들어낸다. -가능하다면 속도 제한(rate limit), 리소스 쿼터, 스로틀링 등 다양한 제한을 적용하여 애초에 예외 상황이 발생하지 않도록 예방하라. 정보기술 분야에서 무제한이어야 하는 것은 없다. 제한이 없으면 애플리케이션 복원력 저하, 서비스 거부(DoS), 무차별 대입 공격 성공, 과도한 클라우드 비용 등의 문제가 발생할 수 있다. +가능하다면 속도 제한(rate limit), 리소스 쿼터, 스로틀링 등 다양한 제한을 적용하여 애초에 예외 상황이 발생하지 않도록 예방한다. 정보기술 분야에서 무제한이어야 하는 것은 없다. 제한이 없으면 애플리케이션 복원력 저하, 서비스 거부(DoS), 무차별 대입 공격 성공, 과도한 클라우드 비용 등의 문제가 발생할 수 있다. -특정 빈도 이상으로 동일한 오류가 반복될 경우, 개별 오류 메시지 대신 발생 횟수와 시간대를 보여주는 통계 형태로 출력하는 것을 고려하라. 이 정보는 자동화된 로깅 및 모니터링을 방해하지 않도록 원본 메시지에 추가하는 방식으로 처리해야 한다. [A09:2025 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)를 참고하라. +특정 빈도 이상으로 동일한 오류가 반복될 경우, 개별 오류 메시지 대신 발생 횟수와 시간대를 보여주는 통계 형태로 출력하는 것을 고려한다. 이 정보는 자동화된 로깅 및 모니터링을 방해하지 않도록 원본 메시지에 추가하는 방식으로 처리해야 한다. [A09:2025 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)를 참고한다. 이 외에도 다음 사항을 포함해야 한다. 엄격한 입력 검증(허용해야 하는 위험 문자에 대한 새니타이징 또는 이스케이프 처리 포함), *중앙 집중화된* 오류 처리, 로깅, 모니터링, 알림 체계, 그리고 전역 예외 핸들러다. 하나의 애플리케이션에서 예외 처리를 위한 여러 함수를 두어서는 안 되며, 한 곳에서 동일한 방식으로 처리해야 한다. 또한 이 섹션의 모든 권고 사항에 대해 프로젝트 보안 요구사항을 수립하고, 설계 단계에서 위협 모델링 또는 보안 설계 검토를 수행하며, 코드 리뷰나 정적 분석을 실시하고, 최종 시스템에 대해 스트레스, 성능, 침투 테스트를 수행해야 한다. diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index fc46ecf18..274543e12 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -13,7 +13,7 @@ OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제 ## 시작하기 -2025년 버전에서 변경되거나 추가된 내용을 파악하려면 [소개](0x00_2025-Introduction.md) 페이지를 획인하라. +2025년 버전에서 변경되거나 추가된 내용을 파악하려면 [소개](0x00_2025-Introduction.md) 페이지를 확인한다. ## 목차 From 73dbf728ca990e23db008e7e8a16c661e0b912a5 Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 22:17:24 +0900 Subject: [PATCH 152/167] improve CWE translations and document cross-references --- .../ko/A09_2025-Security_Logging_and_Alerting_Failures.md | 4 ++-- .../docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index 861bb271c..31acb9f22 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -3,7 +3,7 @@ ## 배경 -보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *CWE-117: 로그 기록 시 출력 인코딩 처리 미흡, CWE-532: 로그에 민감 정보 기록, 그리고 CWE-778: 불충분한 로깅*이다. +보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *CWE-117: 로그 출력 중화 미흡, CWE-532: 로그 파일에 민감 정보 삽입, 그리고 CWE-778: 불충분한 로깅*이다. ## 점수표 @@ -66,7 +66,7 @@ * 적절한 알림 임계값 및 대응 에스컬레이션 절차가 마련되어 있지 않거나 효과적이지 않다. 알림이 적시에 확인되지 않거나 검토되지 않는 경우. * 동적 애플리케이션 보안 테스트(DAST) 도구(예: Burp 또는 ZAP)에 의한 침투 테스트 및 스캔이 알림을 트리거하지 않는 경우. * 진행 중인 공격을 실시간 혹은 준실시간으로 탐지하지 못하거나 상위 단계로 에스컬레이션하거나 알림을 발생시키지 못하는 경우. -* 로깅 및 알림 이벤트를 사용자 또는 공격자에게 노출하거나([A01:2025-접근 제어 실패](A01_2025-Broken_Access_Control.md) 참조), 로깅되면 안 되는 민감정보(예: PII 또는 PHI)를 로깅함으로써 민감정보 유출에 취약한 경우. +* 로깅 및 알림 이벤트를 사용자 또는 공격자에게 노출하거나([A01:2025-불충분한 접근 제어](A01_2025-Broken_Access_Control.md) 참조), 로깅되면 안 되는 민감정보(예: PII 또는 PHI)를 로깅함으로써 민감정보 유출에 취약한 경우. * 로그 데이터 인코딩이 부적절해 로깅 또는 모니터링 시스템 자체가 인젝션 등 공격 대상이 되는 경우. * 애플리케이션이 오류 및 예외 처리를 누락 또는 오처리하여 시스템이 오류 발생 자체를 인지하지 못하고, 결과적으로 문제를 로그로 남길 수 없는 경우. * 특정 상황을 탐지해 알림을 발생시키기 위한 인시던트 유스케이스(use case)가 없거나, 갱신이 되지 않아 현행 환경을 충분히 반영하지 못하는 경우. diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index 1e51d0a33..1bc40cb34 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -4,7 +4,7 @@ 부적절한 예외 처리는 2025년에 신설된 카테고리다. 이 카테고리는 24개의 CWE를 포함하며, 부적절한 오류 처리, 논리적 오류, 페일 오픈(fail open), 그 외 시스템이 비정상적인 상황에서 마주할 수 있는 시나리오를 다룬다. 이 카테고리에는 이전에 낮은 코드 품질과 연관되었던 일부 CWE가 포함되어 있다. 기존의 낮은 코드 품질 카테고리는 너무 광범위했기에, 부적절한 예외 처리라는 구체적인 카테고리로 분리하여 더 명확한 가이드를 제공하고자 했다. -대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족에 대한 부적절한 처리*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 취약한 실패 처리('Failing Open')*가 있다. +대표적인 CWE로는 *CWE-209: 민감한 정보가 포함된 오류 메시지 생성*, *CWE-234: 누락된 파라미터 처리 실패*, *CWE-274: 권한 부족 처리 미흡*, *CWE-476: NULL 포인터 역참조*, 그리고 *CWE-636: 안전하지 않은 실패 처리('Failing Open')*가 있다. ## 점수표 From 8c79fc9c28fcce371bbcf878db2a75fd21c138fd Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 22:24:40 +0900 Subject: [PATCH 153/167] =?UTF-8?q?fix(ko):=20Standardize=20client-side/se?= =?UTF-8?q?rver-side=20terminology=20to=20'=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EC=96=B8=ED=8A=B8=20=EC=B8=A1/=EC=84=9C=EB=B2=84=20=EC=B8=A1'?= =?UTF-8?q?=20in=20A03?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index c45d18864..aafb3037e 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -59,7 +59,7 @@ 다음과 같은 경우 취약하다. -* 사용하는 모든 컴포넌트(클라이언트 사이드, 서버 사이드 모두) 버전을 추적하지 않는 경우. 여기에서 컴포넌트는 직접 사용하는 컴포넌트뿐만 아니라 중첩 (전이) 의존성도 포함한다. +* 사용하는 모든 컴포넌트(클라이언트 측, 서버 측 모두) 버전을 추적하지 않는 경우. 여기에서 컴포넌트는 직접 사용하는 컴포넌트뿐만 아니라 중첩 (전이) 의존성도 포함한다. * 소프트웨어가 취약하거나, 더 이상 지원하지 않거나, 오래된 버전인 경우. 이는 OS, 웹/애플리케이션 서버, 데이터베이스 관리 시스템(DBMS), 애플리케이션, API, 모든 컴포넌트, 런타임 환경 그리고 모든 라이브러리를 포함한다. * 사용 중인 컴포넌트에 대해 주기적으로 취약점을 스캔하지 않거나 보안 공지를 구독하지 않는 경우. * 공급망의 변경을 관리하는 절차가 없거나, 변경 이력을 추적하지 못하는 경우. 여기에는 사용 중인 IDE와 IDE 확장 프로그램(extension) 및 업데이트를 추적하는 것, 조직의 코드 저장소에서 발생하는 변경 사항, 샌드박스, 이미지 및 라이브러리 저장소, 아티팩트가 생성되고 보관되는 방식 등도 모두 포함된다. 공급망을 이루는 모든 요소는 문서화되어야 하며, 특히 변경 사항은 반드시 기록으로 남겨야 한다. @@ -80,7 +80,7 @@ * 전체 소프트웨어에 대한 소프트웨어 자재 명세서(Software Bill of Materials, SBOM)를 중앙에서 생성 및 관리한다. * 직접 추가한 의존성만 추적할 것이 아니라, 그 의존성의 (전이) 의존성, 그리고 그다음 단계 의존성까지 추적한다. * 사용하지 않는 의존성, 불필요한 기능, 컴포넌트, 파일 그리고 문서를 지움으로써 공격 표면을 축소한다. -* OWASP Dependency Track, OWASP Dependency Check, retire.js 등과 같은 도구를 활용해서 클라이언트 사이드와 서버 사이드 컴포넌트(예: 프레임워크, 라이브러리) 및 그 의존성의 버전 정보를 지속적으로 목록화한다. +* OWASP Dependency Track, OWASP Dependency Check, retire.js 등과 같은 도구를 활용해서 클라이언트 측과 서버 측 컴포넌트(예: 프레임워크, 라이브러리) 및 그 의존성의 버전 정보를 지속적으로 목록화한다. * 사용 중인 컴포넌트에 대한 취약점들을 CVE(Common Vulnerabilities and Exposures), 미국 정부가 운영하는 취약점 데이터베이스(National Vulnerability Database), [OSV(Open Source Vulnerabilities)](https://osv.dev/)와 같은 출처를 지속적으로 모니터링한다. 이를 위해 소프트웨어 구성 분석(software composition analysis, SCA) 도구, 소프트웨어 공급망 도구, 보안에 초점이 맞춰진 SBOM 도구를 사용해 이 과정을 자동화한다. 사용 중인 컴포넌트와 관련된 보안 취약점 알림을 구독한다. * 공식(신뢰할 수 있는) 출처에서 암호화가 적용된 링크를 통해서만 컴포넌트를 획득한다. 변조되었거나 악성 컴포넌트가 포함될 가능성을 줄이기 위해 서명된 패키지를 우선시한다. (참고. [A08:2025-소프트웨어, 데이터 무결성 실패](https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/)) * 의존성의 어떤 버전을 사용할지 의도적으로 선택하고, 필요가 있을 때만 업그레이드한다. From eec3cc85b669b241acbd31c4494e49735880c97e Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 22:33:12 +0900 Subject: [PATCH 154/167] review refelect --- .../ko/A09_2025-Security_Logging_and_Alerting_Failures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index 31acb9f22..2a1af8582 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -3,7 +3,7 @@ ## 배경 -보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *CWE-117: 로그 출력 중화 미흡, CWE-532: 로그 파일에 민감 정보 삽입, 그리고 CWE-778: 불충분한 로깅*이다. +보안 로깅 및 알림 실패는 9위를 유지한다. 명칭이 약간 변경되었는데, 로그에서 발생한 이벤트의 조치를 유도하는 데 필요한 알림 기능을 강조하기 위함이다. 이 카테고리는 특성상 데이터상 순위가 낮게 나타나기 쉬우며, 커뮤니티 설문 투표를 통해 이번이 세 번째로 Top 10에 포함되었다. 또한 테스트가 극도로 어렵고, CVE/CVSS 데이터에서의 비중이 매우 낮지만(총 723개의 CVE), 가시성 확보, 인시던트 알림, 그리고 포렌식 측면에서 큰 영향을 미칠 수 있다. 해당 카테고리에 포함되는 CWE는 *CWE-117: 로그 기록 시 출력 인코딩 처리 미흡, CWE-532: 로그 파일에 민감 정보 삽입, 그리고 CWE-778: 불충분한 로깅*이다. ## 점수표 @@ -132,4 +132,4 @@ * [CWE-532 Insertion of Sensitive Information into Log File](https://cwe.mitre.org/data/definitions/532.html) -* [CWE-778 Insufficient Logging](https://cwe.mitre.org/data/definitions/778.html) +* [CWE-778 Insufficient Logging](https://cwe.mitre.org/data/definitions/778.html) \ No newline at end of file From 2c08aed409d8956445e9da8d56bb18f5d1800081 Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 22:44:47 +0900 Subject: [PATCH 155/167] Refine Korean translation: remove unused English terms and improve punctuation --- 2025/docs/ko/X01_2025-Next_Steps.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index d20692efe..68df0d15e 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -71,7 +71,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 이 유형의 취약점을 예방하기 위해서는 시스템의 장애와 복구를 기본 전제로 설계해야 한다. * 제한, 할당량 및 장애 극복(failover) 기능을 추가하되, 특히 자원을 가장 많이 소모하는 작업에 주의를 기울인다. -* 자원 소모가 큰 페이지를 식별하고 사전에 대비해야 한다: 공격 표면을 줄이되, 특히 불명의 또는 신뢰할 수 없는 사용자에게 불필요한 '가젯(gadgets)'과 많은 자원(예: CPU, 메모리)을 요구하는 기능을 노출하지 않도록 한다. +* 자원 소모가 큰 페이지를 식별하고 사전에 대비해야 한다. 공격 표면을 줄이되, 특히 불명의 또는 신뢰할 수 없는 사용자에게 불필요한 가젯과 많은 자원(예: CPU, 메모리)을 요구하는 기능을 노출하지 않도록 한다. * 입력값은 크기 제한을 적용하고 허용 리스트 기반으로 엄격히 검증한 뒤, 철저히 테스트한다. * 응답 크기를 제한하고, 가공되지 않은(raw) 응답을 클라이언트에 그대로 반환하지 않는다(서버 측에서 우선 처리한다). * 기본적으로 페일 클로즈드(fail closed)를 사용하고 절대로 페일 오픈(fail open)을 사용하지 않는다. 우선 거부 정책(deny by default)을 사용하며, 오류가 발생하면 롤백한다. @@ -228,7 +228,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 메모리 안전 언어를 사용할 수 없다면 다음을 수행한다. -* 메모리 관리 오류의 악용을 어렵게 만드는 서버 기능을 활성화한다: 주소 공간 레이아웃 무작위화(Address Space Layout Randomization, ASLR), 데이터 실행 방지(Data Execution Protection, DEP), 구조화된 예외 처리 덮어쓰기 보호(Structured Exception Handling Overwrite Protection, SEHOP). +* 메모리 관리 오류의 악용을 어렵게 만드는 서버 기능을 활성화한다. 주소 공간 배치 무작위화(Address Space Layout Randomization, ASLR), 데이터 실행 방지(Data Execution Protection, DEP), 구조화된 예외 처리(Structured Exception Handling Overwirte Protection). * 애플리케이션의 메모리 누수를 모니터링한다. * 시스템으로 들어오는 모든 입력을 매우 신중하게 검증하고, 기대 조건을 충족하지 않는 입력은 모두 거부한다. * 사용 중인 언어를 학습하여 위험한 함수와 비교적 안전한 함수의 목록을 작성하고, 이를 팀과 공유한다. 가능하다면 이를 시큐어 코딩 가이드라인이나 표준에 추가한다. 예를 들어, C 언어에서는 strcpy() 대신 strncpy()를, strcat() 대신 strncat()을 우선적으로 사용한다. From 0b7e22bebbe0e376270aeabedeed4ed2cb8b030a Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Thu, 8 Jan 2026 22:46:32 +0900 Subject: [PATCH 156/167] typo --- 2025/docs/ko/X01_2025-Next_Steps.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index 68df0d15e..9512af3d0 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -71,7 +71,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 이 유형의 취약점을 예방하기 위해서는 시스템의 장애와 복구를 기본 전제로 설계해야 한다. * 제한, 할당량 및 장애 극복(failover) 기능을 추가하되, 특히 자원을 가장 많이 소모하는 작업에 주의를 기울인다. -* 자원 소모가 큰 페이지를 식별하고 사전에 대비해야 한다. 공격 표면을 줄이되, 특히 불명의 또는 신뢰할 수 없는 사용자에게 불필요한 가젯과 많은 자원(예: CPU, 메모리)을 요구하는 기능을 노출하지 않도록 한다. +* 자원 소모가 큰 페이지를 식별하고 사전에 대비해야 한다. 공격 표면을 줄이되, 특히 불명의 또는 신뢰할 수 없는 사용자에게 불필요한 '가젯'과 많은 자원(예: CPU, 메모리)을 요구하는 기능을 노출하지 않도록 한다. * 입력값은 크기 제한을 적용하고 허용 리스트 기반으로 엄격히 검증한 뒤, 철저히 테스트한다. * 응답 크기를 제한하고, 가공되지 않은(raw) 응답을 클라이언트에 그대로 반환하지 않는다(서버 측에서 우선 처리한다). * 기본적으로 페일 클로즈드(fail closed)를 사용하고 절대로 페일 오픈(fail open)을 사용하지 않는다. 우선 거부 정책(deny by default)을 사용하며, 오류가 발생하면 롤백한다. @@ -228,7 +228,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 메모리 안전 언어를 사용할 수 없다면 다음을 수행한다. -* 메모리 관리 오류의 악용을 어렵게 만드는 서버 기능을 활성화한다. 주소 공간 배치 무작위화(Address Space Layout Randomization, ASLR), 데이터 실행 방지(Data Execution Protection, DEP), 구조화된 예외 처리(Structured Exception Handling Overwirte Protection). +* 메모리 관리 오류의 악용을 어렵게 만드는 서버 기능을 활성화한다. 주소 공간 배치 무작위화(Address Space Layout Randomization, ASLR), 데이터 실행 방지(Data Execution Protection, DEP), 구조화된 예외 처리(Structured Exception Handling Overwrite Protection). * 애플리케이션의 메모리 누수를 모니터링한다. * 시스템으로 들어오는 모든 입력을 매우 신중하게 검증하고, 기대 조건을 충족하지 않는 입력은 모두 거부한다. * 사용 중인 언어를 학습하여 위험한 함수와 비교적 안전한 함수의 목록을 작성하고, 이를 팀과 공유한다. 가능하다면 이를 시큐어 코딩 가이드라인이나 표준에 추가한다. 예를 들어, C 언어에서는 strcpy() 대신 strncpy()를, strcat() 대신 strncat()을 우선적으로 사용한다. From e2a5ba00b26dca7994878899e9a0ad821108041b Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Fri, 9 Jan 2026 00:35:01 +0900 Subject: [PATCH 157/167] 0x00-0x03, A01-A04 final reviews --- 2025/docs/ko/0x00_2025-Introduction.md | 36 +++++++++---------- 2025/docs/ko/0x01_2025-About_OWASP.md | 4 +-- ...025-What_are_Application_Security_Risks.md | 10 +++--- ...g_a_Modern_Application_Security_Program.md | 12 +++---- .../docs/ko/A01_2025-Broken_Access_Control.md | 8 ++--- .../ko/A02_2025-Security_Misconfiguration.md | 2 +- ...A03_2025-Software_Supply_Chain_Failures.md | 4 +-- .../ko/A04_2025-Cryptographic_Failures.md | 4 +-- .../ko/A07_2025-Authentication_Failures.md | 4 +-- 9 files changed, 42 insertions(+), 42 deletions(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 29ff72162..e31682ea6 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -6,7 +6,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! -데이터와 설문 조사를 통해 견해를 나눠주신 모든 분께 깊은 감사를 드립니다. 여러분 없이는 이번 버전이 없었을 겁니다. **감사합니다!** +데이터와 설문 조사를 통해 견해를 나눠주신 모든 분께 깊은 감사를 드립니다. 여러분의 도움 없이는 이번 버전을 만들 수 없었을 것입니다. **감사합니다!** ## OWASP Top 10:2025 소개 @@ -26,34 +26,34 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ## 2025년 Top 10의 변화 -2025년 Top 10의 변화로는 두 개의 신규 카테고리와 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. +2025년 Top 10에는 두 개의 신규 카테고리가 추가되고 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. -![Mapping](../assets/Top10Mapping-ko.PNG) +![Mapping](../assets/Top10Mapping-ko.png) -* **[A01:2025 - 불충분한 접근 제어](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 바와 같이, Server-Side Request Forgery(SSRF)가 이 카테고리에 통합되었다. -* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. -* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)** 기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 우려되는 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 상대적으로 낮게 나타났으나, 이는 테스트상의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. -* **[A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고리에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. Cryptographic Failures가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. -* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, Cryptographic Failures와 Insecure Design 등 인접한 항목들과의 순위에는 변동이 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. Injection은 발생 빈도는 높지만 영향이 비교적 적은 Cross-site Scripting(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. -* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 Security Misconfiguration과 Software Supply Chain Failures에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 눈에 띄는 개선이 확인되었다. -* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/2021/A07_2021-Identification_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 Authentication Failure 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다. -* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 Software Supply Chain Failures보다 상대적으로 더 로우 레벨(Lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary)를 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. -* **[A09:2025 - 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 유도하는 Alerting 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 로그에서 발생한 이벤트에 대해 적절한 대응을 위한 알림(Alert) 기능의 중요성을 강조하기 위한 것이다. 알림 체계가 결여된 로깅은 보안 사고를 식별하는 데 실질적인 효과를 기대하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. -* **[A10:2025 - 부적절한 예외 처리](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(Fail Open) 등 비정상적인 상태에서 비롯되는 24개 CWE를 포함하고 있다. +* **[A01:2025 - 불충분한 접근 제어](A01_2025-Broken_Access_Control.md)**는 가장 심각한 애플리케이션 보안 위험으로 1위를 유지하였다. 제공된 데이터에 따르면 테스트 된 애플리케이션의 평균 3.73%가 이 카테고리에 해당하는 40개 CWE(Common Weakness Enumeration) 중 하나 이상을 가지고 있었다. 위 그림의 점선으로 표시된 것처럼, 서버 측 요청 위조(Server-Side Request Forgery)가 이 카테고리에 통합되었다. +* **[A02:2025 - 보안 설정 오류](A02_2025-Security_Misconfiguration.md)**는 2021년 5위에서 2025년 2위로 상승하였다. 이번 주기에 제공된 데이터에서는 설정 오류가 더 많이 발견되었으며, 테스트 된 애플리케이션 중 3.00%가 이 카테고리에 해당하는 16개 CWE 중 하나 이상을 포함하고 있었다. 이는 소프트웨어 엔지니어링에서 애플리케이션의 동작이 설정에 기반하는 비중이 지속적으로 증가하고 있는 현황을 반영하는 결과이다. +* **[A03:2025 - 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)**는 기존의 [A06:2021-취약하고 오래된 구성 요소](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)의 범위를 확장하여, 소프트웨어 의존성, 빌드 시스템, 배포 인프라 전반에서 발생하는 광범위한 공급망 침해 사례를 포함한다. 본 카테고리는 커뮤니티 설문조사에서 가장 중요한 항목으로 압도적인 지지를 받았다. 이 카테고리에는 총 5개의 CWE가 포함되어 있으며, 수집된 데이터에서는 발생률이 상대적으로 낮게 나타났으나, 이는 테스트의 어려움에 기인한 것으로 판단된다. 향후 이 영역에 대한 테스트가 보완될 것으로 기대된다. 해당 카테고리는 데이터상 발생 빈도는 가장 낮았으나, CVE 기준으로는 평균적인 악용 가능성과 영향 점수가 가장 높은 것으로 확인되었다. +* **[A04:2025 - 암호 실패](A04_2025-Cryptographic_Failures.md)**는 2위에서 4위로 두 단계 하락하였다. 제공된 데이터에 따르면, 평균적으로 전체 애플리케이션의 3.80%가 이 카테고리에 속하는 32개의 CWE 중 하나 이상을 포함하고 있는 것으로 나타났다. 암호 실패가 발생하면 민감한 데이터의 노출이나 시스템 침해로 빈번하게 이어진다. +* **[A05:2025 - 인젝션](A05_2025-Injection.md)**은 3위에서 5위로 하락하였으나, 암호 실패와 안전하지 않은 설계 등 인접한 항목들과의 순위에는 변동이 없었다. 이 카테고리는 테스트가 가장 활발히 수행된 카테고리 중 하나로, 38개 CWE에 대응되는 CVE가 가장 많이 제보되었다. 인젝션은 발생 빈도는 높지만 영향이 비교적 적은 크로스 사이트 스크립팅(높은 빈도/낮은 영향)부터, 발생 빈도는 낮으나 피해 규모가 큰 SQL 인젝션(낮은 빈도/높은 영향)까지 폭넓은 유형을 포함한다. +* **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 상당한 개선이 이루어졌다. +* **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/2021/A07_2021-Identification_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 인증 실패 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다. +* **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 소프트웨어 공급망 실패보다 상대적으로 더 낮은 수준(lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary)를 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. +* **[A09:2025 - 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 가능하게 하는 알림(Alert) 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 알림 체계가 없는 로깅만으로는 보안 사고를 효과적으로 식별하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. +* **[A10:2025 - 부적절한 예외 처리](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(fail open) 등을 포함하는 상태에서 비롯되는 24개 CWE를 포함하고 있다. ## 방법론 -이번 Top 10은 데이터에 기반하되, 데이터에 맹목적으로 의존하지는 않는다. 수집된 데이터를 기반으로 12개 카테고리의 순위를 산정하였으며, 커뮤니티 설문조사 결과를 통해 2개 카테고리를 추가로 선정했다. 이러한 접근 방식을 채택한 근본적인 이유는, 수집된 데이터를 분석하는 것은 본질적으로 과거를 돌아보는 작업이기 때문이다. 애플리케이션 보안 연구자들은 새로운 취약점을 발굴하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자하고 있다. 이러한 테스트를 도구와 프로세스에 통합하기까지는 몇 주에서 몇 년이 소요된다. 특정 취약점을 대규모로 신뢰성 있게 테스트할 수 있게 될 때쯤이면 이미 몇 년이 경과한 경우가 많다. 또한 신뢰성 있게 테스트하기가 어려워 데이터에 반영되지 않는 중요한 위험 항목도 존재한다. 이러한 한계를 보완하기 위해, 현장의 애플리케이션 보안 및 개발 실무자들을 대상으로 커뮤니티 설문을 진행하여, 테스트 데이터에서 충분히 드러나지 않지만 실제로 직면하고 있는 핵심 위험 요소를 파악한다. +이번 Top 10은 데이터에 기반하되, 데이터에 맹목적으로 의존하지는 않는다. 수집된 데이터를 기반으로 12개 카테고리의 순위를 산정하였으며, 커뮤니티 설문조사 결과를 통해 2개 카테고리를 추가로 선정하였다. 이러한 접근 방식을 채택한 근본적인 이유는, 수집된 데이터를 분석하는 것은 본질적으로 과거를 돌아보는 작업이기 때문이다. 애플리케이션 보안 연구자들은 새로운 취약점을 발굴하고 새로운 테스트 방법을 개발하는 데 많은 시간을 투자하고 있다. 이러한 테스트를 도구와 프로세스에 통합하기까지는 몇 주에서 몇 년이 소요된다. 특정 취약점을 대규모로 신뢰성 있게 테스트할 수 있게 될 때쯤이면 이미 몇 년이 경과한 경우가 많다. 또한 신뢰성 있게 테스트하기가 어려워 데이터에 반영되지 않는 중요한 위험 항목도 존재한다. 이러한 한계를 보완하기 위해, 현장의 애플리케이션 보안 및 개발 실무자들을 대상으로 커뮤니티 설문을 진행하여, 테스트 데이터에서 충분히 드러나지 않지만 실제로 직면하고 있는 핵심 위험을 파악한다. ## 카테고리 구성 방식 이번 OWASP Top 10에서는 이전 버전과 비교하여 일부 카테고리가 변경되었다. 아래는 주요 변경 사항에 대한 요약이다. -이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE의 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 이번 버전에서도 CWE의 발생 빈도를 분석에서 제외한다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 퍼져있는 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경이 불가피하였다. +이번 2025년 버전에서는 2021년 버전과 마찬가지로 CWE 범위를 제한하지 않고 자료를 수집하였다. 2021년부터 매년 테스트 된 애플리케이션 수와 테스트 결과 하나 이상의 CWE가 발견된 애플리케이션 수를 기준으로 집계하였다. 이러한 방식은 각 CWE가 전체 애플리케이션에 얼마나 널리 분포하는지 파악할 수 있게 한다. 또한 CWE의 발생 빈도를 분석에서 제외하였다. 빈도 정보는 다른 상황에서는 유의미할 수 있으나, 전체 애플리케이션에 분포한 정도를 왜곡할 수 있기 때문이다. 따라서, 한 애플리케이션에서 CWE가 4건 발견되든 4,000건 발견되든 순위 산정에 영향을 주지 않는다. 이는 수동으로 테스트하는 사람은 반복 취약점을 한 번만 기록하는 반면, 자동화 도구는 모든 취약점을 개별 취약점으로 기록하기 때문이다. 분석 대상 CWE 수는 2017년 약 30개, 2021년 약 400개에서 이번 버전에서는 589개로 크게 확대되었다. 향후 추가 분석을 통해 보완할 계획이며, 이러한 데이터 규모 증가는 카테고리 구조의 변경을 불가피하게 만들었다. -CWE를 그룹화하고 분류하는 작업에 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(root cause) 유형과 증상(symptom) 유형이 있다. 근본 원인의 유형에는 "암호 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근본 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-불충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. +CWE를 그룹화하고 분류하는 작업에는 수개월이 소요되었으며, 추가로 몇 개월을 더 투입할 수도 있었으나 적절한 시점에서 마무리하였다. CWE에는 근본 원인(root cause) 유형과 증상(symptom) 유형이 있다. 근본 원인 유형에는 "암호 실패", "설정 오류" 등이 있고, 증상 유형에는 "민감한 정보 노출", "서비스 거부" 등이 있다. 식별 및 개선 지침을 제공하는 데 있어 근본 원인에 초점을 맞추는 것이 더 논리적이므로 가능한 한 이를 우선시하였다. 증상보다 근본 원인에 집중하는 것은 새로운 개념이 아니며, 기존 Top 10도 증상과 근본 원인이 혼재되어 있었다. CWE 역시도 마찬가지로 혼재되어 있으며, 이번에는 이를 보다 명확하게 구분하고자 하였다. 이번 버전에서 카테고리당 평균 CWE 수는 25개이며, 최소 5개(A03:2025-소프트웨어 공급망 실패, A09:2025-보안 로깅 및 알림 실패)에서 최대 40개(A01:2025-불충분한 접근 제어)까지 분포한다. 카테고리당 CWE 수는 40개를 상한으로 설정하였다. 이러한 카테고리 구조 개편을 통해 기업들이 사용하는 언어나 프레임워크에 적합한 CWE에 집중할 수 있어 교육 효과가 향상될 것으로 기대된다. -MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떻겠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다. 모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않는 경우 도구, 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 인젝션, 커맨드 인젝션, 크로스 사이트 스크립팅, 하드코딩된 패스워드, 검증 부재, 버퍼 오버플로우, 민감 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 다운로드 가능한 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. +MITRE가 선정한 가장 위험한 소프트웨어 취약점 25개와 유사하게 단순히 10개의 CWE 목록으로 전환하는 것이 어떠냐는 질문을 받은 바 있다. 카테고리 내에 여러 CWE를 포함하는 데는 두 가지 주된 이유가 있다. 첫째, 모든 프로그래밍 언어 및 프레임워크에 따라 해당 CWE가 존재하지 않을 수 있다. Top 10의 일부가 적용되지 않으면 도구나 교육/인식 개선 프로그램 측면에서 공백이 생길 수 있다. 둘째, 일반적인 취약점에 대해 여러 CWE가 존재한다. 예를 들어, 일반적인 인젝션, 커맨드 인젝션, 크로스 사이트 스크립팅, 하드코딩된 패스워드, 검증 부재, 버퍼 오버플로우, 민감 정보의 평문 저장 등에 대해 각각 여러 CWE가 있다. 조직이나 테스터에 따라 서로 다른 CWE를 사용할 수 있다. 여러 CWE를 포함하는 카테고리를 사용함으로써 공통된 카테고리명 하에 발생할 수 있는 다양한 유형의 취약점에 대한 기준선과 인식을 높일 수 있다. 이번 Top 10 2025에는 10개 카테고리 내에 248개의 CWE가 포함되어 있다. 본 문서 발행 시점 기준으로 [MITRE에서 제공하는 CWE 사전](https://cwe.mitre.org)에는 총 968개의 CWE가 등록되어 있다. ## 카테고리 선정을 위한 데이터 사용법 @@ -71,7 +71,7 @@ CVSS v4.0을 사용하지 않은 이유가 궁금할 수 있다. 이는 점수 ## 커뮤니티 설문 조사를 사용하는 이유 -조사된 데이터는 주로 업계에서 자동화된 방식으로 테스트할 수 있는 범위에 한정되어 있다. 경험 많은 애플리케이션 보안 전문가들과 대화해 보면 아직 데이터에 반영되지 않은 취약점 유형과 트렌드에 대해 존재함을 알 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되며, 이러한 테스트를 자동화하여 대규모 애플리케이션에 적용하는 데는 더 많은 시간이 필요하다. 현재 확인할 수 있는 모든 것은 과거를 돌아보는 것이며, 그 과정에서 지난해의 트렌드가 충분히 반영되지 않았을 가능성이 있다. +조사된 데이터는 주로 업계에서 자동화된 방식으로 테스트할 수 있는 범위에 한정되어 있다. 경험 많은 애플리케이션 보안 전문가들과 대화해 보면 아직 데이터에 반영되지 않은 취약점 유형과 트렌드가 존재함을 알 수 있다. 특정 취약점 유형에 대한 테스트 방법론을 개발하는 데 시간이 소요되며, 이러한 테스트를 자동화하여 대규모 애플리케이션에 적용하는 데는 더 많은 시간이 필요하다. 현재 확인할 수 있는 모든 것은 과거를 돌아보는 것이며, 그 과정에서 지난해의 트렌드가 충분히 반영되지 않았을 가능성이 있다. 따라서 데이터가 불완전하기 때문에 10개 카테고리 중 8개만 데이터에서 선정한다. 나머지 2개 카테고리는 Top 10 커뮤니티 설문조사에서 도출되었다. 이를 통해 현장 실무자들이 데이터에 포함되지 않거나 데이터로 표현되기 어려운 주요 위험에 대해 직접 투표할 수 있도록 하였다. diff --git a/2025/docs/ko/0x01_2025-About_OWASP.md b/2025/docs/ko/0x01_2025-About_OWASP.md index 518033bb2..e1ee54e25 100644 --- a/2025/docs/ko/0x01_2025-About_OWASP.md +++ b/2025/docs/ko/0x01_2025-About_OWASP.md @@ -18,9 +18,9 @@ OWASP에서는 아래와 같은 무료로 공개된 자료를 제공하고 있 OWASP의 모든 도구, 문서, 동영상, 프레젠테이션을 애플리케이션 보안 개선에 관심이 있는 누구나 자유롭게 이용하고 공유할 수 있도록 공개하고 있다. 각 지역 챕터의 생성 및 참여도 자유롭게 가능하다. -OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역을 개선하는 게 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. +OWASP는 애플리케이션 보안을 사람, 프로세스, 기술의 문제로 접근해야 한다고 믿는다. 이러한 모든 영역을 개선하는 것이 애플리케이션 보안에 대한 가장 효과적인 접근 방식이기 때문이다. -OWASP는 일반적인 조직과는 다른 성격을 지닌다. 상업적 이해관계에서 자유롭기 때문에 편향되지 않으며 실용적이며 비용 효율적인 애플리케이션 보안 정보를 제공할 수 있다. +OWASP는 일반적인 조직과는 다른 성격을 지닌다. 상업적 이해관계에서 자유롭기 때문에 편향되지 않고 실용적이며 비용 효율적인 애플리케이션 보안 정보를 제공할 수 있다. OWASP는 특정 기술 기업과 제휴하지 않지만, 상용 보안 기술의 올바른 활용을 지지한다. OWASP는 다양한 유형의 자료를, 협력을 통해 투명하며 개방적인 방식으로 제작한다. diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index b1eef5ebf..e7c80153b 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -47,7 +47,7 @@
해당되는 CWE 개수 + 해당 CWE 개수 최대 발생률 평균 발생률 최대 테스트 커버리지 + 최대 커버리지 평균 테스트 커버리지 + 평균 커버리지 평균 가중 익스플로잇 점수
-본 위험 등급은 악용 가능성, 취약점에서 보안 통제가 누락되어 있을 평균 가능성, 그리고 기술적 영향을 공통 평가 요소로 산정에 반영하였다. +본 위험 등급은 악용 가능성, 취약점에서 보안 통제가 누락되어 있을 가능성의 평균, 그리고 기술적 영향을 공통 평가 요소로 산정에 반영하였다. 조직은 각기 고유하며, 해당 조직을 대상으로 하는 위협 행위자, 그들의 목표, 그리고 침해 발생 시 영향도 또한 고유하다. 공익 단체가 대외 정보 제공을 위해 콘텐츠 관리 시스템(Content Management System, CMS)을 사용하는 경우와, 의료 시스템에서 동일한 CMS를 민감한 의료 정보에 사용하는 경우를 비교하면, 같은 소프트웨어라 하더라도 위협 행위자와 비즈니스 영향은 크게 달라질 수 있다. 애플리케이션의 노출 수준, 상황별 위협 행위자(비즈니스 및 지역에 따른 표적 공격과 비표적 공격), 그리고 개별 비즈니스 영향을 바탕으로 조직의 위험을 이해하는 것이 중요하다. @@ -56,15 +56,15 @@ 2017년에는 발생률을 기준으로 가능성을 산정하여 카테고리를 선정한 뒤, 수십 년의 경험을 바탕으로 한 팀 논의를 통해 악용 가능성, 탐지 가능성, 기술적 영향을 기준으로 순위를 매겼다. 2021년에는 미국 정부가 운영하는 취약점 데이터베이스(National Vulnerability Database, NVD)의 CVSSv2 및 CVSSv3 점수에서 악용 가능성과 (기술적) 영향을 나타내는 데이터를 활용하였다. 2025년에는 2021년에 수립한 동일한 방법론을 계속 적용하였다. -우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 익스플로잇 점수와 영향 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3는 이를 보완해야 하므로 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. +우리는 OWASP Dependency-Check를 다운로드하여 관련 CWE(Common Weakness Enumeration)별로 그룹화된 CVSS 익스플로잇 점수와 영향 점수를 추출하였다. 모든 CVE에는 CVSSv2 점수가 존재하지만, CVSSv2에는 결함이 있으며 CVSSv3에서 이를 보완하였으나 상당한 조사와 노력이 필요했다. 또한 일정 시점 이후에는 모든 CVE에 CVSSv3 점수도 함께 부여된다. 더불어 CVSSv2와 CVSSv3 사이에는 점수 범위와 산정 공식이 업데이트되었다. CVSSv2에서는 익스플로잇과 (기술적) 영향 점수 모두 최대 10.0까지 가능했으나, 산정 공식에 의해 익스플로잇 점수는 60%, 영향 점수는 40%로 낮춰졌다. CVSSv3에서는 이론상 최대값이 익스플로잇 점수 6.0, 영향 점수 4.0으로 제한되었다. 이러한 가중치를 고려하면, CVSSv3에서 영향 점수는 더 높아져 평균적으로 거의 1.5점 상승했고, 2021 Top 10 분석을 수행했을 때 악용 가능성은 평균적으로 거의 0.5점 하락한 것으로 나타났다. -OWASP Dependency-Check에서 추출한 결과, NVD에는 CWE에 매핑된 CVE 레코드가 약 17만 5천 건(2021년의 12만 5천 건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년의 241개에서 증가)이다. 추출된 약 22만 건의 CVE 중 16만 건에는 CVSS v2 점수가, 15만 6천 건에는 CVSS v3 점수가, 6천 건에는 CVSS v4 점수가 있었다. 다수의 CVE가 여러 버전의 점수를 동시에 보유하므로, 점수 건수 합계는 22만 건을 초과한다. +OWASP Dependency-Check에서 추출한 데이터에 따르면, NVD에는 CWE에 매핑된 CVE 레코드가 약 17만 5천 건(2021년의 12만 5천 건에서 증가) 존재한다. 또한 CVE에 매핑된 고유 CWE는 643개(2021년의 241개에서 증가)이다. 추출된 약 22만 건의 CVE 중 16만 건에는 CVSS v2 점수가, 15만 6천 건에는 CVSS v3 점수가, 6천 건에는 CVSS v4 점수가 있었다. 다수의 CVE가 여러 버전의 점수를 동시에 보유하므로, 점수 건수 합계는 22만 건을 초과한다. Top 10 2025에서는 다음과 같은 방식으로 익스플로잇과 영향의 평균 점수를 산정하였다. CVSS 점수가 있는 모든 CVE를 CWE별로 그룹화한 뒤, 익스플로잇 점수와 영향 점수 모두에 대해 CVSSv3 점수를 보유한 비율과 나머지 CVSSv2 점수 보유 비율을 가중치로 적용하여 전체 평균을 산출하였다. 이렇게 산출한 평균을 데이터셋의 CWE에 매핑하여, 위험 방정식의 나머지 절반에 해당하는 익스플로잇 및 기술적 영향 점수로 사용하였다. -왜 CVSS v4.0을 사용하지 않았을까? 이는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *익스플로잇* 또는 *영향* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. +CVSS v4.0을 사용하지 않은 이유는 점수 산정 알고리즘이 근본적으로 변경되어, CVSSv2와 CVSSv3처럼 *익스플로잇* 또는 *영향* 점수를 쉽게 도출할 수 없기 때문이다. 향후 Top 10 버전에서는 CVSS v4.0 점수를 활용할 수 있는 방법을 모색할 예정이지만, 2025년판에서는 이를 적시에 반영할 방안을 도출하지 못했다. 발생률은 일정 기간 동안 조직이 테스트한 애플리케이션 모집단에서, 각 CWE에 취약한 애플리케이션의 비율로 산정하였다. 다시 말해, 우리는 빈도, 즉 한 애플리케이션에서 문제가 몇 번 발견되는지는 사용하지 않는다. 관심 대상은 애플리케이션 모집단 중 각 CWE가 발견된 애플리케이션의 비율이다. @@ -91,7 +91,7 @@ Top 10 각 카테고리에는 다음과 같은 데이터 요소가 제시되며, **가중 영향 점수:** CWE에 매핑된 CVE에 부여된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수를 정규화하여 10점 척도에 맞춘 값이다. -**커버리지:** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. +**테스트 커버리지:** 특정 CWE에 대해 모든 조직이 테스트한 애플리케이션의 비율이다. **총 발생 건수:** 카테고리에 매핑된 CWE가 발견된 애플리케이션의 총 개수. diff --git a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md index eda6dc82c..894d4df01 100644 --- a/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md +++ b/2025/docs/ko/0x03_2025-Establishing_a_Modern_Application_Security_Program.md @@ -1,10 +1,10 @@ # 현대적 애플리케이션 보안 체계 수립 -OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 항목에서 다루는 중요한 위험의 인식을 높이기 위함이다. 이는 모든 위험을 빠짐없이 다룬 목록이 아니라, 대응을 시작하기 위한 출발점으로 활용하도록 구성되어 있다. 따라서, 이전 버전에서부터 각 항목에 해당하는 위험을 예방하고 더 나아가 전반적인 보안 수준을 높이기 위한 최선의 방법으로 애플리케이션 보안 체계를 시작하는 것을 권고해왔다. 이 페이지에서는 현대적 애플리케이션 보안 체계 수립 시작을 어떻게 하고, 구축하는지 다룬다. +OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 항목에서 다루는 중요한 위험의 인식을 높이기 위함이다. 이는 모든 위험을 빠짐없이 다룬 목록이 아니라, 대응을 시작하기 위한 출발점으로 활용하도록 구성되어 있다. 따라서, 이전 버전에서부터 각 항목에 해당하는 위험을 예방하고 더 나아가 전반적인 보안 수준을 높이기 위한 최선의 방법으로 애플리케이션 보안 체계를 시작하는 것을 권고해 왔다. 이 페이지에서는 현대적 애플리케이션 보안 체계 수립을 어떻게 시작하고 구축하는지를 다룬다. -이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려한다. 해당 모델들은 포괄적이며 세부 항목까지 빠짐없이 다루고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야 좋은 보안 체계라고 할 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 게 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. +이미 애플리케이션 보안 체계를 운영 중이라면, [OWASP 소프트웨어 보증 성숙도 모델(Software Assurance Maturity Model, SAMM)](https://owasp.org/www-project-samm/) 또는 DSOMM(DevSecOps Maturity Model) 같은 성숙도 모델을 활용하여 현재 수준에 대한 성숙도 평가를 수행하는 것을 고려한다. 해당 모델들은 포괄적이며 세부 항목까지 빠짐없이 다루고 있어, 체계를 고도화하는 과정에서 어디에 집중해야 하는지 파악하는 데 활용할 수 있다. OWASP SAMM 및 DSOMM의 모든 항목을 수행해야 좋은 보안 체계라고 할 수 있는 것은 아니며, 이는 방향을 제시하고 다양한 선택지를 제공하기 위한 것이다. 따라서 이는 현실적으로 달성하기 어려운 기준을 제시하거나 과도한 비용이 드는 체계를 수립하는 것이 목적이 아니라, 개선을 위한 다양한 아이디어를 제공하기 위해 폭넓게 구성되어 있다. @@ -17,7 +17,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 조직의 위험 수용 수준에 맞춰, 가능성과 영향도 기준을 표준화한 [통합 위험 평가 모델](https://owasp.org/www-community/OWASP_Risk_Rating_Methodology)을 수립한다. -* 위의 정의된 모델에 따라 전체 애플리케이션 및 API의 위험을 평가하고 우선순위를 결정한 뒤, 결과를 구성 관리 데이터베이스(Configuration Management Database, CMDB)에 등록한다. +* 위에서 정의된 모델에 따라 전체 애플리케이션 및 API의 위험을 평가하고 우선순위를 결정한 뒤, 결과를 구성 관리 데이터베이스(Configuration Management Database, CMDB)에 등록한다. * 적용 범위와 요구되는 엄격도 수준을 정의하기 위한 가이드라인을 수립한다. @@ -50,14 +50,14 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 ### 4. 애플리케이션 보안 교육 -* 개발 조직의 보안 역량 강화를 위해 보안 챔피언(Security Champion) 제도 또는 개발자 대상 보안 교육 프로그램(보안 인식 프로그램이라고 부르기도 함)을 도입하는 방안을 검토한다. 이를 통해 개발자에게 필요한 지식을 교육할 수 있다. 최신 보안 지식을 지속적으로 습득하고, 업무를 안전하게 수행할 수 있도록 지원하며, 보안 문화를 더욱 긍정적으로 만든다. 또한, 보안팀과의 신뢰를 높이고 더 만족스러운 협업 관계를 형성할 수 있다. 관련 가이드는 [OWASP 보안 챔피언 가이드](https://securitychampions.owasp.org/)를 참고하며, 해당 가이드는 단계적으로 보강되고 있다. +* 개발 조직의 보안 역량 강화를 위해 보안 챔피언(Security Champion) 제도 또는 개발자 대상 보안 교육 프로그램(보안 인식 프로그램이라고 부르기도 함)을 도입하는 방안을 검토한다. 이를 통해 개발자에게 필요한 지식을 교육할 수 있다. 최신 보안 지식을 지속적으로 습득하며, 업무를 안전하게 수행할 수 있도록 지원하고, 보안 문화를 더욱 긍정적으로 만든다. 또한, 보안팀과의 신뢰를 높이고 더 만족스러운 협업 관계를 형성할 수 있다. 관련 가이드는 [OWASP 보안 챔피언 가이드](https://securitychampions.owasp.org/)를 참고하며, 해당 가이드는 단계적으로 보강되고 있다. * OWASP 교육 프로젝트는 개발자에게 웹 애플리케이션 보안을 교육하는 데 필요한 교육 자료를 제공한다. 취약점에 대한 실습 중심 학습을 위해 [OWASP Juice Shop 프로젝트](https://owasp.org/www-project-juice-shop/) 또는 [OWASP WebGoat](https://owasp.org/www-project-webgoat/)를 활용한다. 최신 동향을 유지하기 위해 [OWASP AppSec 컨퍼런스](https://owasp.org/events/), [OWASP 컨퍼런스 트레이닝](https://owasp.org/events/), 또는 지역 [OWASP Chapter](https://owasp.org/chapters/) 모임에 참여한다. ### 5. 운영 가시성 확보 -* 지표를 기반으로 관리한다. 수집된 지표 및 분석 데이터를 기반으로 개선 활동과 예산 의사결정을 추진한다. 지표로는 보안 관행 및 활동 준수, 신규 취약점 유입, 취약점 조치, 테스트된 애플리케이션 범위, 결함 유형별 밀도 및 발생 건수 등이 있다. +* 지표를 기반으로 관리한다. 수집된 지표 및 분석 데이터를 기반으로 개선 활동과 예산 의사결정을 추진한다. 지표로는 보안 관행 및 활동 준수, 신규 취약점 유입, 취약점 조치, 테스트 된 애플리케이션 범위, 결함 유형별 밀도 및 발생 건수 등이 있다. * 구현 및 검증 활동에서 축적된 데이터를 분석하여, 근본 원인과 취약점 패턴을 식별하고, 전사 차원의 전략 및 시스템적 개선을 추진한다. 실수로부터 학습하고, 개선을 촉진하기 위해 긍정적 인센티브를 제공한다. @@ -109,7 +109,7 @@ OWASP Top 10 항목들은 보안 인식을 제고하기 위한 문서로, 각 * 조직이 애플리케이션 및 API를 구축할 때 따르는 프로세스를 개선하기 위해, [OWASP 소프트웨어 보증 성숙도 모델(SAMM)](https://owasp.org/www-project-samm/)을 권장한다. 이 모델은 조직이 직면한 특정 위험에 맞춘 소프트웨어 보안 전략을 수립하고 구현하는 데 도움이 된다. -* 소프트웨어 개발자에게 시큐어 코딩 교육을 제공하고, 보다 견고하고 안전한 애플리케이션을 만들도록 지원하는 데 도움이 된다고 판단되는 기타 교육도 제공한다. +* 소프트웨어 개발자에게 시큐어 코딩 교육을 제공하고, 보다 견고하고 안전한 애플리케이션을 만드는 데 도움이 되는 기타 교육도 제공한다. * 코드 리뷰를 수행한다. [OWASP 치트 시트: 시큐어 코드 리뷰](https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html)를 참고한다. diff --git a/2025/docs/ko/A01_2025-Broken_Access_Control.md b/2025/docs/ko/A01_2025-Broken_Access_Control.md index f4cf126d2..e60fc9dda 100644 --- a/2025/docs/ko/A01_2025-Broken_Access_Control.md +++ b/2025/docs/ko/A01_2025-Broken_Access_Control.md @@ -4,7 +4,7 @@ ## 배경 -불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할 만한 CWE는 *CWE-200: 비인가자에게 민감 정보 노출*, *CWE-201: 전송된 데이터로부터의 민감 정보 노출*, *CWE-918: 서버 측 요청 위조(SSRF)*, 그리고 *CWE-352: 크로스 사이트 요청 위조(CSRF)*가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. +불충분한 접근 제어는 OWASP TOP 10에서 1위를 유지하고 있다. 테스트 된 모든 애플리케이션에서 불충분한 접근 제어 취약점이 발견되었으며, 주목할 만한 CWE는 *CWE-200: 비인가자에게 민감 정보 노출*, *CWE-201: 전송된 데이터로부터의 민감 정보 노출*, *CWE-918: 서버 측 요청 위조(SSRF)*, 그리고 *CWE-352: 크로스 사이트 요청 위조(CSRF)*가 있다. 해당 카테고리는 제공받은 데이터 기준 발생 건수가 가장 많았으며, 관련된 CVE 건수는 두 번째로 많았다. ## 점수표 @@ -56,7 +56,7 @@ ## 설명 -접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 접근 제어 실패는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제, 또는 사용자 제한사항에 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔히 발견되는 불충분한 접근 제어 취약점 목록은 다음과 같다. +접근 제어는 사용자가 의도된 권한을 벗어나는 행위를 하지 못하도록 정책을 강제한다. 접근 제어 실패는 일반적으로 비인가자 정보 유출, 데이터 수정 및 삭제, 또는 사용자 제한사항을 벗어나는 비즈니스 기능을 수행으로 이어질 수 있다. 흔히 발견되는 불충분한 접근 제어 취약점 목록은 다음과 같다. * 최소 권한 원칙 위반, 우선 거부 정책(Deny by Default)이 적용되지 않아 제한된 기능, 역할, 사용자들에게만 허용된 접근 권한이 불특정 다수에게 허용되는 경우. * URL 조작(파라미터 변조 및 강제 브라우징), 애플리케이션 내부 상태값 변조, HTML 페이지 변조, 공격 도구를 통한 API 요청 변조와 같은 방식으로 접근 제어가 우회될 수 있다. @@ -75,7 +75,7 @@ * 공개 리소스를 제외한 모든 리소스는 우선 거부 정책(Deny By Default)을 따라야 한다. -* 접근 제어 메커니즘을 구현한 후에는 전체 애플리케이션에 재사용하고 교차 출처 리소스 검증(CORS) 사용을 최소화한다. +* 접근 제어 메커니즘을 구현한 후에는 전체 애플리케이션에 재사용하고 교차 출처 리소스 공유(CORS) 사용을 최소화한다. * 모델 수준의 접근 제어는 레코드 소유자 기준으로 접근 권한을 제한하도록 한다. 다른 사용자가 임의의 레코드에 대해 생성, 조회, 수정, 삭제를 수행하도록 하지 못하게 한다. * 애플리케이션의 고유한 비즈니스 제약사항은 도메인 모델에 의해 검사한다. * 웹 서버의 디렉터리 리스팅(directory listing)를 비활성화하고, 웹 루트(web root) 내에 파일 메타데이터(예: .git) 및 백업 파일이 존재하지 않도록 해야 한다. @@ -105,7 +105,7 @@ https://example.com/app/accountInfo?acct=notmyacct ``` -**시나리오 2:** 공격자는 단순하게 대상 URL로 브라우저를 이용해 접속할 수 있다. 하지만 관리자 페이지 접근하기 위해선 관리자 권한이 요구된다. +**시나리오 2:** 공격자는 단순하게 대상 URL로 브라우저를 이용해 접속할 수 있다. 하지만 관리자 페이지에 접근하기 위해선 관리자 권한이 요구된다. ``` diff --git a/2025/docs/ko/A02_2025-Security_Misconfiguration.md b/2025/docs/ko/A02_2025-Security_Misconfiguration.md index 413e106aa..5b7038598 100644 --- a/2025/docs/ko/A02_2025-Security_Misconfiguration.md +++ b/2025/docs/ko/A02_2025-Security_Misconfiguration.md @@ -79,7 +79,7 @@ * 재사용할 수 있는 하드닝 프로세스를 구축하여 필요한 보안 통제가 적용된 동일한 형태의 신규 환경을 빠르고 쉽게 배포할 수 있어야 한다. 개발, QA, 운영 환경은 모두 동일한 구성으로 설정하며, 각각의 환경에서 서로 다른 자격 증명을 사용한다. 이 프로세스는 자동화하여 요구되는 새로운 보안 환경을 구성하는 데 필요한 노력을 최소화한다. * 사용하지 않은 기능, 컴포넌트, 문서, 샘플을 포함하지 않는 최소한의 플랫폼을 구현한다. 사용하지 않는 기능과 프레임워크는 삭제하거나 설치되지 않아야 한다. -* 패치 관리 프로세스(참고: [A03 소프트웨어 공급망 체인 실패](A03_2025-Software_Supply_Chain_Failures.md)) 수행 시 모든 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트를 한다. 또한, 클라우드 스토리지 권한(예: S3 버킷 권한)을 점검한다. +* 패치 관리 프로세스(참고: [A03 소프트웨어 공급망 실패](A03_2025-Software_Supply_Chain_Failures.md)) 수행 시 모든 보안 공지, 업데이트, 패치에 따른 적절한 검토 및 업데이트를 한다. 또한, 클라우드 스토리지 권한(예: S3 버킷 권한)을 점검한다. * 구성 요소 간 또는 테넌트 간을 효과적으로 격리할 수 있도록 세분화, 컨테이너화, 클라우드 보안 그룹(ACL)을 활용해 애플리케이션 아키텍처를 설계함으로써 효과적이고 안전한 분리 구조를 보장한다. * 보안 지시문을 클라이언트로 보내야 한다. (예: 보안 헤더) * 자동화된 프로세스를 구축하여 모든 환경에서 해당 설정들의 안전성을 검증한다. diff --git a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md index aafb3037e..c609f10e5 100644 --- a/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md +++ b/2025/docs/ko/A03_2025-Software_Supply_Chain_Failures.md @@ -3,7 +3,7 @@ ## 배경 -소프트웨어 공급망 실패는 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정하였다. 2013년 TOP 10에 "A9 - 사용 중인 컴포넌트 내 알려진 취약점" 으로 처음 등장한 이후, 해당 카테고리는 "알려진 취약점" 외에도 "모든 공급망 실패"를 포함하도록 범위가 확장되었다. 범위가 확대됨에도 불구하고, 공급망 실패는 여전히 식별이 어려우며, 관련 CWE와 매핑된 CVE가 11개에 불과하다. 그러나, 수집한 데이터를 테스트하고 보고한 결과에 따르면 이번 카테고리는 5.19%라는 가장 높은 평균 발생률을 보였고, 관련된 CWE로는 *CWE-477: 더 이상 사용되지 않는 기능 사용*, *CWE-1104: 관리되지 않은 외부 컴포넌트 사용*, *CWE-1329: 업데이트할 수 없는 컴포넌트에 대한 의존*, 그리고 *CWE-1395: 취약한 외부 컴포넌트 의존*이 있다. +소프트웨어 공급망 실패는 TOP 10 커뮤니티 조사에서 정확히 50%의 응답자가 1위로 선정하였다. 2013년 TOP 10에 "A9 - 사용 중인 컴포넌트 내 알려진 취약점"으로 처음 등장한 이후, 해당 카테고리는 "알려진 취약점" 외에도 "모든 공급망 실패"를 포함하도록 범위가 확장되었다. 범위가 확대됨에도 불구하고, 공급망 실패는 여전히 식별이 어려우며, 관련 CWE와 매핑된 CVE가 11개에 불과하다. 그러나, 수집한 데이터를 테스트하고 보고한 결과에 따르면 이번 카테고리는 5.19%라는 가장 높은 평균 발생률을 보였고, 관련된 CWE로는 *CWE-477: 더 이상 사용되지 않는 기능 사용*, *CWE-1104: 관리되지 않은 외부 컴포넌트 사용*, *CWE-1329: 업데이트할 수 없는 컴포넌트에 대한 의존*, 그리고 *CWE-1395: 취약한 외부 컴포넌트 의존*이 있다. ## 점수표 @@ -59,7 +59,7 @@ 다음과 같은 경우 취약하다. -* 사용하는 모든 컴포넌트(클라이언트 측, 서버 측 모두) 버전을 추적하지 않는 경우. 여기에서 컴포넌트는 직접 사용하는 컴포넌트뿐만 아니라 중첩 (전이) 의존성도 포함한다. +* 사용하는 모든 컴포넌트(클라이언트 측, 서버 측 모두) 버전을 추적하지 않는 경우. 여기에서 컴포넌트는 직접 사용하는 컴포넌트뿐만 아니라 중첩 의존성(중첩 전이 의존성)도 포함한다. * 소프트웨어가 취약하거나, 더 이상 지원하지 않거나, 오래된 버전인 경우. 이는 OS, 웹/애플리케이션 서버, 데이터베이스 관리 시스템(DBMS), 애플리케이션, API, 모든 컴포넌트, 런타임 환경 그리고 모든 라이브러리를 포함한다. * 사용 중인 컴포넌트에 대해 주기적으로 취약점을 스캔하지 않거나 보안 공지를 구독하지 않는 경우. * 공급망의 변경을 관리하는 절차가 없거나, 변경 이력을 추적하지 못하는 경우. 여기에는 사용 중인 IDE와 IDE 확장 프로그램(extension) 및 업데이트를 추적하는 것, 조직의 코드 저장소에서 발생하는 변경 사항, 샌드박스, 이미지 및 라이브러리 저장소, 아티팩트가 생성되고 보관되는 방식 등도 모두 포함된다. 공급망을 이루는 모든 요소는 문서화되어야 하며, 특히 변경 사항은 반드시 기록으로 남겨야 한다. diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index dbfa4cf40..107850186 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -58,7 +58,7 @@ ## 설명 -일반적으로, [전송 계층](https://en.wikipedia.org/wiki/Transport_layer)([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model)) 에서의 모든 데이터는 암호화되어 전송해야 한다. 과거에는 CPU 성능과 프라이빗 키/인증서 관리가 장벽이었다. 현재는 암호 연산 가속을 위한 CPU 전용 명령어(예: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set)) 가 도입되었고, [LetsEncrypt.org](https://letsencrypt.org/) 같은 서비스와 대형 클라우드 공급업체가 자사 플랫폼에 긴밀히 통합된 인증서 관리 서비스를 제공하면서 프라이빗 키와 인증서 관리도 간소화되었다. +일반적으로, [전송 계층](https://en.wikipedia.org/wiki/Transport_layer) ([OSI 4계층](https://en.wikipedia.org/wiki/OSI_model))에서의 모든 데이터는 암호화되어 전송해야 한다. 과거에는 CPU 성능과 프라이빗 키/인증서 관리가 장벽이었다. 현재는 암호 연산 가속을 위한 CPU 전용 명령어(예: [AES support](https://en.wikipedia.org/wiki/AES_instruction_set))가 도입되었고, [LetsEncrypt.org](https://letsencrypt.org/) 같은 서비스와 대형 클라우드 공급업체가 자사 플랫폼에 긴밀히 통합된 인증서 관리 서비스를 제공하면서 프라이빗 키와 인증서 관리도 간소화되었다. 전송 계층 보안 외에도 어떤 데이터가 저장 시 암호화가 필요한지, 그리고 전송 중([애플리케이션 계층](https://en.wikipedia.org/wiki/Application_layer), OSI 7계층)에 추가적인 암호화가 필요한지 결정하는 것이 중요하다. 예를 들어 패스워드, 신용카드 번호, 건강 기록, 개인 정보, 비즈니스 기밀은 추가 보호가 필요하다. 특히 해당 데이터가 개인정보 보호법(예: EU의 GDPR)이나 규정(예: PCI-DSS)의 적용을 받는 경우 더욱 중요하다. 이러한 모든 데이터에 대해 다음을 확인해야 한다. @@ -88,7 +88,7 @@ * 애플리케이션이 처리, 저장, 전송하는 데이터를 분류하고 라벨링한다. 개인정보 보호법, 규제 요구사항, 비즈니스 필요에 따라 어떤 데이터가 민감한지 식별한다. * 가장 민감한 키는 하드웨어 또는 클라우드 기반 HSM(하드웨어 보안 모듈)에 보관한다. * 암호 알고리즘은 가능하면 신뢰할 수 있는 구현체(라이브러리)를 사용한다. -* 불필요한 민감 데이터는 저장하지 않는다. 저장할 시 가능한 한 빨리 폐기하거나 PCI DSS 준수 토큰화(PCI DSS compliant tokenization) 또는 마스킹(truncation)을 적용한다. 저장하지 않은 데이터는 탈취될 수 없다. +* 불필요한 민감 데이터는 저장하지 않는다. 저장 시 가능한 한 빨리 폐기하거나 PCI DSS 준수 토큰화(PCI DSS compliant tokenization) 또는 마스킹(truncation)을 적용한다. 저장하지 않은 데이터는 탈취될 수 없다. * 저장된 모든 민감 데이터가 암호화되었는지 확인한다. * 최신의 강력한 표준 알고리즘, 프로토콜, 키가 적용되어 있는지 확인하고, 적절한 키 관리를 수행한다. * 전송 중인 모든 데이터는 TLS 1.2 이상의 프로토콜로만 암호화하고, 전방향 비밀성(Forward Secrecy) 암호를 사용하며, CBC(Cipher Block Chaining) 암호에 대한 지원을 중단하고, 양자 내성 키 교환 알고리즘을 지원한다. HTTPS는 HSTS(HTTP Strict Transport Security)를 사용해 강제한다. 도구를 활용해 모든 항목을 검사한다. diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index 9a5ff0edd..eae9b0a7a 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -104,13 +104,13 @@ * 세션은 높은 엔트로피를 가진 새로운 무작위 세션 ID를 생성하는 서버 측의 안전한 내장 세션 관리자를 사용한다. 세션 식별자는 URL에 포함되지 않아야 하며, 쿠키에 안전하게 저장되고, 로그아웃하거나 유휴 시간 및 최대 세션 시간 초과 시 무효가 되어야 한다. -* 가능하면 인증, 아이덴티티, 세션 관리를 자체 구현하기보다 사전 제작된, 신뢰할 수 있는 시스템을 사용한다. 가능하다면 검증되고 충분히 테스트된 도구를 구매/활용해 구현 위험을 줄인다. +* 가능하면 인증, 아이덴티티, 세션 관리를 자체 구현하기보다 사전 제작된, 신뢰할 수 있는 시스템을 사용한다. 가능하다면 검증되고 충분히 테스트 된 도구를 구매/활용해 구현 위험을 줄인다. * 제공된 자격 증명의 의도된 용도를 검증한다. 예를 들어 JWT의 경우 `aud`와 `iss` 클레임 및 범위를 검증한다. ## 공격 시나리오 예시 -**시나리오 1:** 크리덴셜 스터핑은 유출된 계정-비밀번호 조합을 자동으로 대입하는 대표적인 공격이다. 최근에는 사람들의 습관을 악용해 비밀번호의 숫자를 증가 및 감소시켜 가며 공격하는 사례가 확인되고 있다. 예를 들어, 예를 들어 'Winter2025'를 'Winter2026'으로 바꾸거나, 'ILoveMyDog6'를 'ILoveMyDog7' 또는 'ILoveMyDog5'로 바꾸는 식이다. 이러한 공격을 하이브리드 크리덴셜 스터핑 공격 또는 패스워드 스프레이 공격이라고 하며, 기존의 크리덴셜 스터핑보다 더 효과적일 수 있다. 애플리케이션이 자동화된 위협(무차별 대입, 스크립트, 봇) 또는 크리덴셜 스터핑에 대한 방어를 구현하지 않으면, 해당 애플리케이션은 자격 증명이 유효한지 여부를 판별하는 패스워드 오라클로 악용되어 비인가 접근을 획득하는 데 사용될 수 있다. +**시나리오 1:** 크리덴셜 스터핑은 유출된 계정-비밀번호 조합을 자동으로 대입하는 대표적인 공격이다. 최근에는 사람들의 습관을 악용해 비밀번호의 숫자를 증가 및 감소시켜 가며 공격하는 사례가 확인되고 있다. 예를 들어 'Winter2025'를 'Winter2026'으로 바꾸거나, 'ILoveMyDog6'를 'ILoveMyDog7' 또는 'ILoveMyDog5'로 바꾸는 식이다. 이러한 공격을 하이브리드 크리덴셜 스터핑 공격 또는 패스워드 스프레이 공격이라고 하며, 기존의 크리덴셜 스터핑보다 더 효과적일 수 있다. 애플리케이션이 자동화된 위협(무차별 대입, 스크립트, 봇) 또는 크리덴셜 스터핑에 대한 방어를 구현하지 않으면, 해당 애플리케이션은 자격 증명이 유효한지 여부를 판별하는 패스워드 오라클로 악용되어 비인가 접근을 획득하는 데 사용될 수 있다. **시나리오 2:** 인증 공격의 상당수는 비밀번호만으로 인증을 구성하는 구조에서 발생한다. 과거에 권장되던 주기적 비밀번호 변경 및 과도한 복잡도 정책은 오히려 비밀번호 재사용을 늘리고 기억하기 쉬운 취약 패턴을 만들 수 있다. 따라서 NIST 800-63의 권고에 맞춰 불필요한 정책을 지양하고, 중요 시스템에는 다중 인증(MFA)을 기본으로 강제 적용하는 것이 바람직하다. From b4a3ddb3ade93de898edca94af6a7748be179a10 Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Fri, 9 Jan 2026 01:08:39 +0900 Subject: [PATCH 158/167] lower cases --- 2025/docs/ko/0x00_2025-Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index e31682ea6..721dfc7c8 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -38,7 +38,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! * **[A06:2025 - 안전하지 않은 설계](A06_2025-Insecure_Design.md)**는 보안 설정 오류와 소프트웨어 공급망 실패에 밀려 4위에서 6위로 두 단계 하락했다. 이 카테고리는 2021년에 도입되었으며, 이후 업계에서 위협 모델링과 안전한 설계에 대한 인식이 높아지면서 상당한 개선이 이루어졌다. * **[A07:2025 - 인증 실패](A07_2025-Authentication_Failures.md)**는 7위를 유지하였으며, 해당 카테고리에 속하는 36개의 CWE를 보다 정확히 반영하기 위해 명칭("[신원 확인 및 인증 실패](https://owasp.org/Top10/2021/A07_2021-Identification_and_Authentication_Failures/)")이 일부 변경되었다. 이 카테고리는 여전히 중요한 항목이지만, 인증을 위한 표준화된 프레임워크의 활용이 증가하면서 인증 실패 사례의 발생 빈도 감소에 긍정적인 영향을 미친 것으로 보인다. * **[A08:2025 - 소프트웨어 또는 데이터 무결성 실패](A08_2025-Software_or_Data_Integrity_Failures.md)**는 이번에도 8위를 차지하였다. 이 카테고리는 소프트웨어 공급망 실패보다 상대적으로 더 낮은 수준(lower level)에서 소프트웨어, 코드, 데이터 등의 무결성을 검증하고 트러스트 바운더리(Trust Boundary)를 유지하는 과정에서 발생하는 실패에 초점을 두고 있다. -* **[A09:2025 - 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 가능하게 하는 알림(Alert) 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 알림 체계가 없는 로깅만으로는 보안 사고를 효과적으로 식별하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. +* **[A09:2025 - 보안 로깅 및 알림 실패](A09_2025-Security_Logging_and_Alerting_Failures.md)**는 9위를 유지하였다. 이 카테고리는 로깅 이벤트에 대한 적절한 대응을 가능하게 하는 알림(alert) 기능의 중요성을 강조하기 위해 명칭이 변경되었다(기존 [보안 로깅 및 모니터링 실패](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring)). 알림 체계가 없는 로깅만으로는 보안 사고를 효과적으로 식별하기 어렵다. 이 카테고리는 특성상 데이터에 과소반영되는 경향이 있으며, 이번에도 커뮤니티 설문을 통해 순위가 결정되었다. * **[A10:2025 - 부적절한 예외 처리](A10_2025-Mishandling_of_Exceptional_Conditions.md)**는 2025년에 새롭게 도입된 카테고리이다. 이 카테고리는 시스템이 비정상적인 상태에 직면했을 때 발생할 수 있는 부적절한 오류 처리, 논리적 오류, 페일 오픈(fail open) 등을 포함하는 상태에서 비롯되는 24개 CWE를 포함하고 있다. ## 방법론 From da1a194d11e75b8f428d7ea132a9d27fdd182183 Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Fri, 9 Jan 2026 01:23:00 +0900 Subject: [PATCH 159/167] Final review - Correct terminology and improve clarity (#42) * Correct terminology and improve clarity * Revert "Correct terminology and improve clarity" This reverts commit e912b9a1516049fb9f8de3ad6a47259e5d984b83. * Revert "Revert "Correct terminology and improve clarity"" This reverts commit 855951ba1bc65e1c0f95f5d1c73a5953085b72ac. * rollback * reflect feedback --- 2025/docs/ko/A05_2025-Injection.md | 11 +++++------ 2025/docs/ko/A06_2025-Insecure_Design.md | 8 ++++---- .../ko/A07_2025-Authentication_Failures.md | 6 +++--- ...2025-Software_or_Data_Integrity_Failures.md | 14 +++++++------- ...5-Security_Logging_and_Alerting_Failures.md | 18 +++++++++--------- ...25-Mishandling_of_Exceptional_Conditions.md | 6 +++--- 2025/docs/ko/X01_2025-Next_Steps.md | 18 +++++++++--------- 7 files changed, 40 insertions(+), 41 deletions(-) diff --git a/2025/docs/ko/A05_2025-Injection.md b/2025/docs/ko/A05_2025-Injection.md index 6936eb68b..a996ed31f 100644 --- a/2025/docs/ko/A05_2025-Injection.md +++ b/2025/docs/ko/A05_2025-Injection.md @@ -2,7 +2,7 @@ ## 배경 -인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 테스트 되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 개가 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 개가 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화('크로스 사이트 스크립팅')에 대한 보고된 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향 점수가 낮아졌다. +인젝션은 3위에서 5위로 두 단계 하락했으며, A04:2025-암호 실패 및 A06:2025-안전하지 않은 설계 대비 상대적 위치는 변동이 없다. 인젝션은 가장 많이 테스트 된 카테고리 중 하나로, 조사된 모든 애플리케이션에서 최소 한 번 이상 테스트가 수행되었다. 인젝션은 다른 카테고리보다 가장 많은 수의 CVE를 보유했으며, 총 37개의 CWE가 포함되었다. 이 카테고리에는 총 3만 건아 넘는 CVE가 보고된 크로스 사이트 스크립팅(높은 빈도/낮은 영향)과 1만 4천 건이 넘는 CVE가 보고된 SQL 인젝션(낮은 빈도/높은 영향)이 포함되었다. CWE-79 웹 페이지 생성 중 입력값의 부적절한 중립화('크로스 사이트 스크립팅')의 CVE 수가 매우 많아 이 카테고리의 평균 가중 영향 점수를 낮추는 요인이 되었다. ## 점수표 @@ -62,8 +62,7 @@ * 동적 쿼리 또는 파라미터 바인딩이 없는 호출을 해당 컨텍스트에 맞는 이스케이프 없이 인터프리터에 직접 전달하는 경우. * 객체 관계형 매핑(object-relational mapping, ORM) 검색 파라미터에 새니타이징되지 않은 입력값을 사용하여, 의도하지 않은 추가 민감 데이터 레코드를 조회하는 경우. * 잠재적으로 악의적일 수 있는 데이터가 그대로 사용되거나, 기존 SQL 또는 커맨드 뒤에 문자열로 이어 붙여지는 경우. 그 결과 동적 쿼리, 커맨드, 또는 저장 프로시저에서 원래의 구문과 공격자가 주입한 악성 데이터가 함께 포함되게 된다. - -대표적인 인젝션 유형으로는 SQL, NoSQL, OS 커맨드, 객체 관계형 매핑(ORM), LDAP, 그리고 EL 표현식(Expression Language) 및 OGNL 표현식(Object Graph Navigation Library) 인젝션이 있다. 인터프리터 종류가 달라도 핵심 원리는 동일하다. 효과적인 탐지를 위해서는 소스 코드 리뷰와 함께, 모든 파라미터, 헤더, URL, 쿠키, JSON, SOAP, 및 XML 데이터 입력에 대한 자동화(퍼징 포함) 테스트하는 게 좋다. CI/CD 파이프라인에 정적(SAST), 동적(DAST), 및 인터랙티브(IAST) 애플리케이션 보안 테스트 도구를 통합하여, 것도 운영 환경 배포 전에 인젝션 결함을 식별하는 데 도움이 될 수 있다. +대표적인 인젝션 유형으로는 SQL, NoSQL, OS 커맨드, 객체 관계형 매핑(ORM), LDAP, 그리고 EL(Expression Language) 및 OGNL(Object Graph Navigation Library) 인젝션이 있다. 인터프리터 종류와 관계없이 핵심 원리는 동일하다. 효과적인 탐지를 위해서는 소스 코드 리뷰와 함께, 모든 파라미터, 헤더, URL, 쿠키, JSON, SOAP, 및 XML 데이터 입력에 대한 자동화 테스트(퍼징 포함)를 수행하는 것이 좋다. CI/CD 파이프라인에 정적(SAST), 동적(DAST), 및 인터랙티브(IAST) 애플리케이션 보안 테스트 도구를 통합하여, 운영 환경 배포 전에 인젝션 결함을 사전에 식별할 수 있다. 한편 LLM 환경에서도 유사한 계열의 인젝션 취약점이 흔해지고 있다. 이는 [OWASP LLM Top 10](https://genai.owasp.org/llm-top-10/)에서 별도로 다룬다. 특히 [LLM01:2025 프롬프트 인젝션](https://genai.owasp.org/llmrisk/llm01-prompt-injection/) 항목에서 관련 내용을 확인할 수 있다. @@ -77,7 +76,7 @@ 데이터를 커맨드로부터 분리하는 것이 불가능한 경우, 다음 방법을 사용하여 위협을 줄일 수 있다. -* 서버 측 입력값 검증은 허용 목록 기반(positive validation)을 사용한다. 다만 텍스트 입력란이나 모바일 API처럼 특수문자 입력이 필요한 경우가 많아, 이것만으로는 완전한 방어가 되기 어렵다. +* 서버 측 입력값 검증은 허용 목록 기반(positive validation)을 사용한다. 다만 텍스트 입력란이나 모바일 API처럼 특수문자 입력이 필요한 경우가 많아, 이러한 방법만으로는 완전한 방어가 되기 어렵다. * 불가피하게 동적 쿼리를 사용하는 지점이 남아 있다면, 사용 중인 인터프리터에서 사용하는 규칙에 맞춰 특수문자를 이스케이프 처리한다. **참고:** 테이블 명과 칼럼 명 같은 SQL 구문들은 이스케이프할 수 없으므로, 사용자가 제공한 입력값을 쓰는 것은 위험하다. 이런 문제는 보고서 생성 기능에서 자주 나타난다. @@ -105,7 +104,7 @@ http://example.com/app/accountView?id=' OR '1'='1 Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'"); ``` -공격자는 입력값으로 `' OR custID IS NOT NULL OR custID='`를 입력한다. 이는 필터를 우회하고 모든 계정의 레코드를 반환한다. HQL은 로우(raw) SQL보다 위험한 함수가 더 적지만, 사용자 입력 값이 쿼리의 문자열로 연결될 때 여전히 권한이 없는 데이터 접근할 수 있다. +공격자는 입력값으로 `' OR custID IS NOT NULL OR custID='`를 입력한다. 이는 필터를 우회하고 모든 계정의 레코드를 반환한다. HQL은 로우(raw) SQL보다 위험한 함수가 더 적지만, 사용자 입력 값이 쿼리의 문자열로 연결될 때 여전히 권한이 없는 데이터에 접근할 수 있다. **시나리오 3:** 애플리케이션이 사용자 입력을 OS 커맨드로 사용한다. @@ -131,7 +130,7 @@ Runtime.getRuntime().exec(cmd); -## 해당되는 CWE 목록 +## 해당 CWE 목록 * [CWE-20 Improper Input Validation](https://cwe.mitre.org/data/definitions/20.html) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 90fd2ea7b..0e21b4daf 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -68,7 +68,7 @@ ### 요구사항 수집 및 리소스 관리 -비즈니스 부서와 협업하여 애플리케이션의 비즈니스 요구사항을 수집 및 조율하며, 모든 데이터 자산과 예상되는 비즈니스 로직에 대해 기밀성, 무결성, 가용성, 인증성 관점의 보호 요구사항을 함께 정의한다. 애플리케이션의 대외 노출 수준을 고려하고, 그리고 단순 접근 제어 수준을 넘어서는 테넌트 격리가 필요한지 아닌지를 고려한다. 기능 요구사항뿐 아니라 비기능 보안 요구사항까지 포함해 기술 요구사항을 정리한다. 또한, 보안 활동을 포함한 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의한다. +비즈니스 부서와 협업하여 애플리케이션의 비즈니스 요구사항을 수집 및 조율하며, 모든 데이터 자산과 예상되는 비즈니스 로직에 대해 기밀성, 무결성, 가용성, 인증성 관점의 보호 요구사항을 함께 정의한다. 애플리케이션의 대외 노출 수준을 고려하고, 그리고 단순 접근 제어 수준을 넘어서는 테넌트 격리가 필요한지 고려한다. 기능 요구사항뿐 아니라 비기능 보안 요구사항까지 포함해 기술 요구사항을 정리한다. 또한, 보안 활동을 포함한 설계, 구축, 테스트, 운영 전반을 포괄하는 예산을 계획하고 협의한다. ### 안전한 설계 @@ -94,7 +94,7 @@ * 애플리케이션의 각 계층(프론트엔드부터 백엔드까지)에 요청과 데이터가 타당한지 검증하는 절차를 추가한다. * 위협 모델에 기반해 핵심 흐름이 안전한지 검증하는 단위 및 통합 테스트를 구현하고, 애플리케이션 계층별 정상 시나리오*와* 악용 시나리오를 취합한다. * 외부 노출 수준과 보호 필요도에 따라 시스템 및 네트워크 레벨에서 분리한다. -* 전 계층에 걸쳐 설계 단계부터 테넌트 격리(tenant isolation)를 강하게 보장한다. +* 전 계층에 걸쳐 설계 단계부터 테넌트 격리를 강하게 보장한다. * 전 계층에서 테넌트를 구조적으로 격리되도록 한다. @@ -102,7 +102,7 @@ **시나리오 1:** 계정 복구 절차에 "질문-답변 방식"을 넣는 경우가 있는데, 이는 NIST 800-63b, OWASP ASVS 및 OWASP Top 10에서 금지하는 설계다. 질문-답변은 여러 사람이 답을 알고 있을 수 있어 본인 확인의 근거로 신뢰하기 어렵다. 따라서 해당 기능은 제거하고, 보다 안전한 복구 설계로 대체하는 것이 바람직하다. -**시나리오 2:** 한 영화관 체인이 단체 예매 할인 정책을 운용하며, 참석 인원이 15명을 초과하면 보증금을 요구한다고 가정한다. 공격자는 이 예약 흐름을 위협 모델링한 뒤 비즈니스 로직의 허점을 찾아, 몇 번의 요청(14명으로 여러번)만으로 전 지점에 걸쳐 좌석 600석을 동시에 예약해 매출 손실을 유발할 수 있다. +**시나리오 2:** 한 영화관 체인이 단체 예매 할인 정책을 운용하며, 예매 인원이 15명을 초과하면 보증금을 요구한다고 가정한다. 공격자는 이 예약 흐름을 위협 모델링한 뒤 비즈니스 로직의 허점을 찾아, 몇 번의 요청(14명으로 여러번)만으로 전 지점에 걸쳐 좌석 600석을 동시에 예약해 매출 손실을 유발할 수 있다. **시나리오 3:** 한 유통 체인의 전자상거래 사이트가 리셀러 구매 봇을 차단하지 못하면, 고가 그래픽카드가 대량 매집되어 리셀 채널로 흘러갈 수 있다. 이는 제조사와 유통사 모두에 대한 부정적 여론을 초래하고, 해당 제품을 어떤 가격에서도 구할 수 없었던 마니아층의 반감을 장기화한다. 제품 판매 개시 직후 극단적으로 짧은 시간 내 구매, 비정상 다량 구매 등 도메인 규칙 기반의 봇 방어 설계를 적용하면, 비정상 구매를 탐지해 거래를 거절할 수 있다. @@ -119,7 +119,7 @@ * [Awesome Threat Modeling](https://github.com/hysnsec/awesome-threat-modelling) -## 해당되는 CWE 목록 +## 해당 CWE 목록 * [CWE-73 External Control of File Name or Path](https://cwe.mitre.org/data/definitions/73.html) diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index eae9b0a7a..a1e28ac38 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -3,7 +3,7 @@ ## 배경 -인증 실패는 동일하게 7위를 유지하고 있으며, 해당 카테고리에 해당되는 36개의 CWE를 보다 정확하게 반영하기 위해 명칭을 약간 변경했다. 표준화된 프레임워크로부터의 이점에도 불구하고, 이 카테고리는 2021년부터 7위를 유지해 왔다. 대표적인 CWE로는 *CWE-259: 하드코딩된 비밀번호 사용*, *CWE-297: 호스트 불일치 상황에서의 인증서 검증 미흡*, *CWE-287: 부적절한 인증*, *CWE-384: 세션 고정(Session Fixation)*, 그리고 *CWE-798: 하드코딩된 자격 증명 사용*이 포함된다. +인증 실패는 동일하게 7위를 유지하고 있으며, 이 카테고리에 해당되는 36개의 CWE를 보다 정확하게 반영하기 위해 명칭을 약간 변경했다. 표준화된 프레임워크로부터의 이점에도 불구하고, 이 카테고리는 2021년부터 7위를 유지해 왔다. 대표적인 CWE로는 *CWE-259: 하드코딩된 비밀번호 사용*, *CWE-297: 호스트 불일치 상황에서의 인증서 검증 미흡*, *CWE-287: 부적절한 인증*, *CWE-384: 세션 고정(Session Fixation)*, 그리고 *CWE-798: 하드코딩된 자격 증명 사용*이 포함된다. ## 점수표 @@ -88,7 +88,7 @@ * 가능하다면 사용자가 더 나은 선택을 할 수 있도록 비밀번호 관리자의 사용을 장려하고 활성화한다. -* 배포 시점에 기본 계정 및 기본 비밀번호가 남아있지 않도록 하며, 특히 관리자 계정은 더 신경쓴다. +* 배포 시점에 기본 계정 및 기본 비밀번호가 남아있지 않도록 하며, 특히 관리자 더 주의를 기울인다. * 신규 및 변경 비밀번호에 대해 최악의 비밀번호 Top 10,000에 기반하여 해당 비밀번호를 설정하지 못하도록 적용한다. @@ -123,7 +123,7 @@ * [OWASP Secure Coding Practices](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/stable-en/01-introduction/05-introduction) -## 해당되는 CWE 목록 +## 해당 CWE 목록 * [CWE-258 Empty Password in Configuration File](https://cwe.mitre.org/data/definitions/258.html) diff --git a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md index 433a59d1f..6b9843ed0 100644 --- a/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md +++ b/2025/docs/ko/A08_2025-Software_or_Data_Integrity_Failures.md @@ -55,24 +55,24 @@ ## 설명 -소프트웨어 및 데이터 무결성 실패는 유효하지 않거나 신뢰할 수 없는 코드 또는 데이터가 신뢰할 수 있고 유효한 것으로 취급되는 것을 방지하지 못하는 코드 및 인프라와 관련된다. 예를 들어, 애플리케이션이 신뢰할 수 없는 출처, 저장소, 콘텐츠 전송 네트워크(CDN)에서 제공되는 플러그인, 라이브러리, 모듈에 의존하는 경우가 이에 해당한다. 소프트웨어 무결성 검증을 수행하지 않거나 제공하지 않는 불안전한 CI/CD 파이프라인은 비인가 접근, 불안전하거나 악의적인 코드, 또는 시스템 손상으로 이어질 잠재적 위험을 초래할 수 있다. 또 다른 예로, CI/CD가 신뢰할 수 없는 장소에서 코드나 아티팩트를 가져오고, 사용 전에 서명 확인 등 유사한 메커니즘으로 이를 검증하지 않는 경우가 있다. 마지막으로, 많은 애플리케이션에는 자동 업데이트 기능이 포함되어 있는데, 업데이트가 충분한 무결성 검증 없이 다운로드되어 기존에 신뢰하던 애플리케이션에 그대로 적용되는 경우가 있다. 이런 구조에서는 공격자가 자신의 업데이트를 업로드해 이를 모든 설치본에 배포, 실행되도록 만들 수 있다. 또 다른 예로, 객체나 데이터가 공격자가 확인하고 수정할 수 있는 형태로 인코딩되거나 직렬화된 경우, 불안전한 역직렬화(insecure deserialization)에 취약해질 수 있다. +소프트웨어 및 데이터 무결성 실패는 검증되지 않은 코드나 데이터가 신뢰 가능한 것으로 취급되는 일을 막지 못하는 코드 및 인프라에서 발생하는 문제다. 예를 들어, 애플리케이션이 신뢰할 수 없는 출처, 저장소, 콘텐츠 전송 네트워크(CDN)에서 제공되는 플러그인, 라이브러리, 모듈에 의존하는 경우가 이에 해당한다. 소프트웨어 무결성 검증을 수행하지 않거나 제공하지 않는 불안전한 CI/CD 파이프라인은 비인가 접근, 불안전하거나 악의적인 코드, 또는 시스템 손상으로 이어질 잠재적 위험을 초래할 수 있다. 또 다른 예로, CI/CD가 신뢰할 수 없는 장소에서 코드나 아티팩트를 가져오고, 사용 전에 서명 확인 등 유사한 메커니즘으로 이를 검증하지 않는 경우가 있다. 마지막으로, 많은 애플리케이션에는 자동 업데이트 기능이 포함되어 있는데, 업데이트가 충분한 무결성 검증 없이 다운로드되어 기존에 신뢰하던 애플리케이션에 그대로 적용되는 경우가 있다. 이런 구조에서는 공격자가 자신의 업데이트를 업로드해 이를 모든 설치본에 배포, 실행되도록 만들 수 있다. 또 다른 예로, 객체나 데이터가 공격자가 확인하고 수정할 수 있는 형태로 인코딩되거나 직렬화된 경우, 역직렬화 취약점이 발생할 수 있다. ## 대응 방안 * 디지털 서명 또는 유사한 메커니즘을 사용하여 소프트웨어나 데이터가 예상된 출처에서 왔고 변조되지 않았음을 검증한다. -* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 저장소만 사용하도록 보장한다. 위험 수준이 더 높다면, 잘 검증된 내부 저장소를 호스팅하는 방안을 고려한다. +* npm이나 Maven과 같은 라이브러리 및 의존성이 신뢰할 수 있는 저장소만 사용하도록 보장한다. 위험 수준이 높은 시스템이라면, 잘 검증된 저장소를 내부에 호스팅하는 방안을 고려한다. * 악의적인 목적의 코드 또는 설정이 소프트웨어 파이프라인에 유입될 가능성을 최소화하기 위해, 코드 및 설정 변경에 대한 검토 절차를 마련한다. -* 빌드 및 배포 과정에서 흐르는 코드의 무결성을 보장할 수 있도록, CI/CD 파이프라인에 적절한 분리(격리), 구성, 접근 제어를 적용한다. -* 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 수신된 뒤, 변조 또는 재전송을 탐지하기 위한 무결성 검사나 디지털 서명 없이 사용되지 않도록 보장한다. +* 빌드 및 배포 과정에서 흐르는 코드의 무결성을 보장할 수 있도록, CI/CD 파이프라인에 적절한 격리, 구성, 접근 제어를 적용한다. +* 서명되지 않았거나 암호화되지 않은 직렬화 데이터가 신뢰할 수 없는 클라이언트로부터 전달된다면, 변조 또는 재전송 여부를 탐지하기 위한 무결성 검사나 전자 서명 없이는 사용하지 않는다. ## 공격 시나리오 예시 -**시나리오 1 신뢰할 수 없는 외부 웹 기능 연동:** 한 회사가 고객 지원 기능을 제공받기 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 고객 지원 제공업체로 전송된다. 고객 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. +**시나리오 1 신뢰할 수 없는 외부 웹 기능 연동:** 한 회사가 고객 지원 기능 제공을 위해 외부 서비스 제공업체를 사용한다. 편의상 `myCompany.SupportProvider.com`을 `support.myCompany.com`으로 DNS 매핑해 두었다. 그 결과 `myCompany.com` 도메인에 설정된 모든 쿠키(인증 쿠키 포함)가 이제 고객 지원 제공업체로 전송된다. 고객 지원 제공업체의 인프라에 접근할 수 있는 누구든 `support.myCompany.com`을 방문한 모든 사용자의 쿠키를 탈취하여 세션 하이재킹 공격을 수행할 수 있다. -**시나리오 2 서명 없이 업데이트:** 많은 가정용 라우터, 셋톱박스, 장치 펌웨어 등은 업데이트를 위해 서명된 펌웨어를 사용하지 않는다. 서명되지 않은 펌웨어는 공격자에게 점점 더 매력적인 표적이 되고 있으며, 앞으로도 악화될 것으로 예상된다. 이는 대개 향후 버전에서 수정한 뒤 이전 버전이 자연스럽게 사라질 때까지 기다려야 수밖에 없는 경우가 많다는 점에서 큰 우려 사항이다. +**시나리오 2 서명 없이 업데이트:** 많은 가정용 라우터, 셋톱박스, 장치 펌웨어 등은 업데이트를 위해 서명된 펌웨어를 사용하지 않는다. 서명되지 않은 펌웨어는 공격자에게 점점 더 매력적인 표적이 되고 있으며, 앞으로도 이러한 상황은 악화될 것으로 예상된다. 이는 대개 향후 버전에서 수정한 뒤 이전 버전이 자연스럽게 사라질 때까지 기다려야 수밖에 없는 경우가 많다는 점에서 큰 우려 사항이다. **시나리오 3 신뢰할 수 없는 출처의 패키지 사용:** 한 개발자가 찾고 있는 패키지의 최신 버전을 구하기 어렵자, 일반적으로 사용하는 신뢰할 수 있는 패키지 관리자가 아니라 온라인 웹사이트에서 패키지를 다운로드한다. 해당 패키지는 서명되어 있지 않으므로 무결성을 보장할 방법이 없다. 해당 패키지에는 악의적인 코드가 포함되어 있다. @@ -90,7 +90,7 @@ * [Insecure Deserialization by Tenendo](https://tenendo.com/insecure-deserialization/) -## 해당되는 CWE 목록 +## 해당 CWE 목록 * [CWE-345 Insufficient Verification of Data Authenticity](https://cwe.mitre.org/data/definitions/345.html) diff --git a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md index 2a1af8582..26a1f4a93 100644 --- a/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md +++ b/2025/docs/ko/A09_2025-Security_Logging_and_Alerting_Failures.md @@ -58,18 +58,18 @@ 로깅과 모니터링이 없으면 공격 및 침해를 탐지할 수 없으며, 알림이 없으면 보안 인시던트 발생 시 신속하고 효과적으로 대응하기가 매우 어렵다. 아래와 같은 경우, 능동적 대응을 위한 로깅, 지속적 모니터링, 탐지, 알림이 부족한 것으로 볼 수 있다. -* 로그인, 로그인 실패, 중요 거래 데이터 등 감사가 필요한 대상의 이벤트가 누락되거나 기준 없이 일관성 없이(예: 성공 로그인만 기록) 로깅되는 경우. +* 로그인, 로그인 실패, 중요 거래 데이터 등 감사가 필요한 대상의 이벤트가 누락되거나 기준이나 일관성이 없이(예: 성공 로그인만 기록) 로깅되는 경우. * 경고 및 오류가 로그 메시지를 생성하지 않거나, 부적절하거나, 불명확한 로그를 생성하는 경우. * 로그가 위변조되지 않도록 무결성 보호가 적용되지 않는 경우. * 애플리케이션 및 API 로그를 기반으로 한 이상징후 모니터링이 수행되지 않는 경우. * 로그가 로컬에만 보관되고 백업이 적절히 수행되지 않는 경우. -* 적절한 알림 임계값 및 대응 에스컬레이션 절차가 마련되어 있지 않거나 효과적이지 않다. 알림이 적시에 확인되지 않거나 검토되지 않는 경우. +* 적절한 알림 임계값 및 대응 에스컬레이션 절차가 마련되어 있지 않거나 효과적이지 않은 경우. 알림이 적시에 확인되지 않거나 검토되지 않는 경우. * 동적 애플리케이션 보안 테스트(DAST) 도구(예: Burp 또는 ZAP)에 의한 침투 테스트 및 스캔이 알림을 트리거하지 않는 경우. * 진행 중인 공격을 실시간 혹은 준실시간으로 탐지하지 못하거나 상위 단계로 에스컬레이션하거나 알림을 발생시키지 못하는 경우. -* 로깅 및 알림 이벤트를 사용자 또는 공격자에게 노출하거나([A01:2025-불충분한 접근 제어](A01_2025-Broken_Access_Control.md) 참조), 로깅되면 안 되는 민감정보(예: PII 또는 PHI)를 로깅함으로써 민감정보 유출에 취약한 경우. +* 로그 및 알림을 사용자 또는 공격자에게 노출하거나([A01:2025-불충분한 접근 제어](A01_2025-Broken_Access_Control.md) 참조), 로깅되면 안 되는 민감정보(예: PII 또는 PHI)를 로깅함으로써 민감 정보 유출에 취약한 경우. * 로그 데이터 인코딩이 부적절해 로깅 또는 모니터링 시스템 자체가 인젝션 등 공격 대상이 되는 경우. * 애플리케이션이 오류 및 예외 처리를 누락 또는 오처리하여 시스템이 오류 발생 자체를 인지하지 못하고, 결과적으로 문제를 로그로 남길 수 없는 경우. -* 특정 상황을 탐지해 알림을 발생시키기 위한 인시던트 유스케이스(use case)가 없거나, 갱신이 되지 않아 현행 환경을 충분히 반영하지 못하는 경우. +* 특정 상황을 탐지해 알림을 발생시키기 위한 인시던트 유스케이스가 없거나, 갱신이 되지 않아 현행 환경을 충분히 반영하지 못하는 경우. * 너무 많은 오탐 알림으로 인해 중요한 알림과 중요하지 않은 알림을 구분할 수 없게 되어, 알림이 너무 늦게 인지되거나 전혀 인지되지 않는 경우(SOC 팀의 물리적 과부하). * 유스케이스에 대한 플레이북이 불완전하거나, 최신이 아니거나, 누락되어 감지된 알림을 올바르게 처리할 수 없는 경우. @@ -86,21 +86,21 @@ * 오류가 발생한 모든 트랜잭션은 롤백되고 다시 시작되도록 한다. 또한, 페일 클로즈드(fail closed)되도록 한다. * 애플리케이션 또는 사용자 행위가 의심스러운 경우 알림을 발행한다. 개발자가 이를 코드로 구현할 수 있도록 가이드를 제공하거나, 이를 위한 시스템을 구매한다. * DevSecOps 및 보안 팀은 SOC(Security Operations Center) 팀이 의심 활동을 신속히 탐지하고 대응할 수 있도록, 플레이북을 포함한 효과적인 모니터링 및 알림 유스케이스를 수립해야 한다. -* 공격자를 위한 함정으로 '허니 토큰(honeytoken)'을 애플리케이션에 추가한다. 예를 들어 데이터베이스 내에 실제 사용자 및/또는 시스템 계정 형태의 데이터 또는 식별자를 삽입한다. 허니토큰은 정상 업무에서는 사용되지 않으므로, 접근이 발생하면 관련 이벤트가 로그로 남고 오탐이 거의 없는 알림 조건으로 활용할 수 있다. +* 공격자를 위한 함정으로 '허니 토큰'을 애플리케이션에 추가한다. 예를 들어 데이터베이스 내에 실제 사용자 및/또는 시스템 계정 형태의 데이터 또는 식별자를 삽입한다. 허니토큰은 정상 업무에서는 사용되지 않으므로, 접근이 발생하면 관련 이벤트가 로그로 남고 오탐이 거의 없는 알림 조건으로 활용할 수 있다. * 필요 시 행위 기반 분석 및 AI를 보조 수단으로 활용해 오탐을 낮추고 알림 품질을 개선한다. * NIST 800-61r2 이상 수준의 인시던트 대응 및 복구 계획을 마련하고, 개발자에게 공격/인시던트 징후를 교육해 보고 및 초기 대응이 가능하도록 한다. -추가로, OWASP ModSecurity 핵심 규칙 세트(Core Rule Set)와 같은 상용 및 오픈소스 애플리케이션 보호 제품, 그리고 사용자 정의 대시보드 및 알림 기능을 제공하여 대응에 도움이 될 수 있는 Elasticsearch, Logstash, Kibana(ELK) 스택과 같은 오픈소스 로그 상관분석 소프트웨어가 있다. 공격에 준실시간으로 대응하거나 이를 차단하는 데 도움이 되는 상용 옵저버빌리티(observability) 도구도 존재한다. +추가로, OWASP ModSecurity 핵심 규칙 세트(Core Rule Set)와 같은 상용 및 오픈소스 애플리케이션 보호 제품, 그리고 사용자 정의 대시보드 및 알림 기능을 제공하여 대응에 도움이 될 수 있는 Elasticsearch, Logstash, Kibana(ELK) 스택과 같은 오픈소스 로그 상관분석 소프트웨어가 있다. 공격에 준실시간으로 대응하거나 이를 차단하는 데 도움이 되는 상용 옵저버빌리티 도구도 존재한다. ## 공격 시나리오 예시 -**시나리오 1:** 한 아동 건강보험 제공업체의 웹사이트 운영자는 모니터링 및 로깅 부재로 인해 침해 사고를 탐지하지 못했다. 외부 제3자가 해당 제공업체에 공격자가 350만 명이 넘는 아동의 민감한 건강 기록 수천 건에 접근하여 이를 수정했다고 통보했다. 사후 분석에서는 웹사이트 개발자가 중대한 취약점을 장기간 방치된 정황이 확인되었으며, 시스템의 로그와 모니터링되고 있지 않아 침해가 2013년부터 7년 이상 지속되었을 가능성도 존재한다. +**시나리오 1:** 한 아동 건강보험 제공업체의 웹사이트 운영자는 모니터링 및 로깅 부재로 인해 침해 사고를 탐지하지 못했다. 외부 제3자가 해당 제공업체에 공격자가 350만 명이 넘는 아동의 건강 정보 기록 수천 건에 접근하여 이를 수정했다고 통보했다. 사후 분석에서는 웹사이트 개발자가 중대한 취약점을 장기간 방치된 정황이 확인되었으며, 시스템 로그가 모니터링되고 있지 않아 침해가 2013년부터 7년 이상 지속되었을 가능성도 존재한다. **시나리오 2:** 인도의 주요 항공사에서 여권 및 신용카드 데이터를 포함해 수백만 명 승객의 10년 이상 분량 개인정보가 유출되었다. 해당 유출은 제3자 클라우드 호스팅 제공업체에서 발생했으며, 해당 제공업체는 일정 시간이 지난 뒤에야 항공사에 침해 사실을 통보했다. -**시나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록을 탈취되었다. 그 결과 항공사는 개인정보 감독기관으로부터 2,000만 파운드의 벌금을 부과받았다. +**시나리오 3:** 유럽의 주요 항공사는 GDPR 신고 의무가 있는 침해 사고를 겪었다. 보고에 따르면, 결제 애플리케이션 보안 취약점이 공격자에 의해 악용되었고, 공격자는 40만 건이 넘는 고객 결제 기록이 탈취되었다. 그 결과 항공사는 개인정보 감독기관으로부터 2,000만 파운드의 벌금을 부과받았다. ## 참조 @@ -122,7 +122,7 @@ - [Real world example of such failures in Snowflake Breach](https://www.huntress.com/threat-library/data-breach/snowflake-data-breach) -## 해당되는 CWE 목록 +## 해당 CWE 목록 * [CWE-117 Improper Output Neutralization for Logs](https://cwe.mitre.org/data/definitions/117.html) diff --git a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md index 1bc40cb34..fd02f9d51 100644 --- a/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md +++ b/2025/docs/ko/A10_2025-Mishandling_of_Exceptional_Conditions.md @@ -65,7 +65,7 @@ ## 대응 방안 -예외 상황을 적절히 처리하려면 이러한 상황에 대비한 계획을 세워야 한다(최악의 상황을 예상하라). 모든 시스템 오류를 발생 지점에서 직접 캐치(catch)하고, 이를 처리해야 한다. 여기서 처리란 문제 해결을 위한 의미 있는 조치를 취하고 정상 상태로 복구하는 것을 의미한다. 처리 과정에는 오류 발생 시 사용자에게 이해하기 쉬운 방식으로 알리고, 이벤트를 로깅하며, 필요하다고 판단되면 알림을 발송하는 것이 포함되어야 한다. 또한 놓친 예외가 있을 경우를 대비해 전역 예외 핸들러(Global Exception Handler)를 구현해야 한다. 이상적으로는 반복되는 오류나 진행 중인 공격을 나타내는 패턴을 감시하고, 이에 대응, 방어, 차단할 수 있는 모니터링 또는 옵저버빌리티 도구를 갖추는 것이 좋다. 이를 통해 오류 처리 취약점을 악용하는 스크립트와 봇에 대응하고 차단할 수 있다. +예외 상황을 적절히 처리하려면 이러한 상황에 대비한 계획을 세워야 한다(최악의 상황을 예상하라). 모든 시스템 오류를 발생 지점에서 캐치(catch)하고 이를 처리해야한다. 여기서 처리란 문제 해결을 위한 의미 있는 조치를 취하고 정상 상태로 복구하는 것을 의미한다. 처리 과정에는 오류 발생 시 사용자에게 이해하기 쉬운 방식으로 알리고, 이벤트를 로깅하며, 필요하다고 판단되면 알림을 발송하는 것이 포함되어야 한다. 또한 놓친 예외가 있을 경우를 대비해 전역 예외 핸들러(Global Exception Handler)를 구현해야 한다. 이상적으로는 반복되는 오류나 진행 중인 공격을 나타내는 패턴을 감시하고, 이에 대응, 방어, 차단할 수 있는 모니터링 또는 옵저버빌리티 도구를 갖추는 것이 좋다. 이를 통해 오류 처리 취약점을 악용하는 스크립트와 봇에 대응하고 차단할 수 있다. 예외 상황을 캐치하고 처리하면 프로그램의 기반 인프라가 예측 불가능한 상황에 노출되는 것을 방지할 수 있다. 트랜잭션 처리 도중이라면, 트랜잭션의 모든 부분을 롤백하고 처음부터 다시 시작하는 것이 매우 중요하다(이를 fail closed라고 한다). 트랜잭션을 중간 상태에서 복구하려는 시도는 종종 복구 불가능한 오류를 만들어낸다. @@ -83,7 +83,7 @@ **시나리오 2:** 데이터베이스 오류가 사용자에게 그대로 노출되면 민감한 시스템 정보가 유출된다. 공격자는 이를 악용해 의도적으로 오류를 유발하고, 수집한 정보를 기반으로 더 정교한 SQL 인젝션 공격을 구성할 수 있다. -**시나리오 3:** 공격자가 네트워크 장애를 일으켜 여러 단계로 이루어진 트랜잭션을 중간에 방해할 수 있다. 예를 들어 트랜잭션이 사용자 계좌 출금, 대상 계좌 입금, 트랜잭션 로깅 순서로 처리된다고 가정한다면, 중간에 오류가 발생해도 시스템이 전체를 롤백(안전한 실패)하지 않으면 문제가 생긴다. 공격자는 이를 악용해 사용자 계좌에서 돈만 빠져나가게 하거나, 레이스 컨디션을 이용해 대상 계좌로 여러 번 송금할 수 있다. +**시나리오 3:** 공격자가 네트워크 장애를 일으켜 여러 단계로 이루어진 트랜잭션을 중간에 방해할 수 있다. 예를 들어 트랜잭션이 사용자 계좌 출금, 대상 계좌 입금, 트랜잭션 로깅 순서로 처리된다고 가정한다면, 중간에 오류가 발생해도 시스템이 전체 트랜잭션을 롤백(안전한 실패)하지 않으면 문제가 생긴다. 공격자는 이를 악용해 사용자 계좌에서 돈만 빠져나가게 하거나, 레이스 컨디션을 이용해 대상 계좌로 여러 번 송금할 수 있다. ## 참조 @@ -105,7 +105,7 @@ * [Example of real-world mishandling of an exceptional condition](https://www.firstreference.com/blog/human-error-and-internal-control-failures-cause-us62m-fine/) -## 해당되는 CWE 목록 +## 해당 CWE 목록 * [CWE-209 Generation of Error Message Containing Sensitive Information](https://cwe.mitre.org/data/definitions/209.html) * [CWE-215 Insertion of Sensitive Information Into Debugging Code](https://cwe.mitre.org/data/definitions/215.html) * [CWE-234 Failure to Handle Missing Parameter](https://cwe.mitre.org/data/definitions/234.html) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index 9512af3d0..d1f937519 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -1,6 +1,6 @@ # 다음 단계 -OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선정한다. 각 버전의 OWASP Top 10에는 포함 여부를 두고 충분히 검토되었으나, 다른 위험들이 더 빈번하게 발생하고 영향도도 더 컸기 때문에 최종 목록에 포함되지 않은 "경계선상(on the cusp)" 위험들이 존재한다. +OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선정한다. 각 버전의 OWASP Top 10에는 포함 여부를 두고 충분히 검토되었으나, 다른 위험들이 더 빈번하게 발생하고 영향도도 더 컸기 때문에 최종 목록에 포함되지 않은 "경계선상"의 위험들이 존재한다. 아래의 세 가지 이슈는 발견 및 조치에 투자할 만한 가치가 크며, 성숙한 애플리케이션 보안 프로그램을 목표로 하는 조직, 보안 컨설팅 회사, 또는 제품의 커버리지를 확장하려는 보안 도구 벤더에 특히 유용할 수 있다. @@ -62,7 +62,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 ### 설명 -이 카테고리는 애플리케이션이 스트레스, 장애 및 엣지 케이스에 대응하는 방식 전반에 존재하는 시스템적 약점을 의미하며, 그 결과 장애 발생 시 애플리케이션이 정상 상태로 복구하지 못할 수 있다. 애플리케이션이 예기치 않은 조건, 리소스 제약 및 기타 불리한 이벤트를 원활하게(gracefully) 처리하지 못하거나, 견디지 못하거나, 또는 복구하지 못할 경우, 가용성 문제(일반적으로)로 이어지며, 그 외에도 데이터 손상, 민감 데이터 노출, 연쇄 장애 또는 보안 통제 우회를 유발할 수 있다. +이 카테고리는 애플리케이션이 스트레스, 장애 및 엣지 케이스에 대응하는 방식 전반에 존재하는 시스템적 약점을 의미하며, 그 결과 장애 발생 시 애플리케이션이 정상 상태로 복구하지 못할 수 있다. 애플리케이션이 예기치 않은 조건, 리소스 제약 및 기타 불리한 이벤트를 우아하게(gracefully) 처리하지 못하거나, 견디지 못하거나, 또는 복구하지 못할 경우, 가용성 문제(일반적으로)로 이어지며, 그 외에도 데이터 손상, 민감 데이터 노출, 연쇄 장애 또는 보안 통제 우회를 유발할 수 있다. 또한 [X02:2025 메모리 관리 실패](#x022025-memory-management-failures) 역시 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있다. @@ -70,20 +70,20 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 이 유형의 취약점을 예방하기 위해서는 시스템의 장애와 복구를 기본 전제로 설계해야 한다. -* 제한, 할당량 및 장애 극복(failover) 기능을 추가하되, 특히 자원을 가장 많이 소모하는 작업에 주의를 기울인다. +* 제한, 할당량 및 페일오버(failover) 기능을 추가하되, 특히 자원을 가장 많이 소모하는 작업에 주의를 기울인다. * 자원 소모가 큰 페이지를 식별하고 사전에 대비해야 한다. 공격 표면을 줄이되, 특히 불명의 또는 신뢰할 수 없는 사용자에게 불필요한 '가젯'과 많은 자원(예: CPU, 메모리)을 요구하는 기능을 노출하지 않도록 한다. * 입력값은 크기 제한을 적용하고 허용 리스트 기반으로 엄격히 검증한 뒤, 철저히 테스트한다. * 응답 크기를 제한하고, 가공되지 않은(raw) 응답을 클라이언트에 그대로 반환하지 않는다(서버 측에서 우선 처리한다). * 기본적으로 페일 클로즈드(fail closed)를 사용하고 절대로 페일 오픈(fail open)을 사용하지 않는다. 우선 거부 정책(deny by default)을 사용하며, 오류가 발생하면 롤백한다. * 리퀘스트 스레드에서 동기식 차단 호출(blocking synchronous call)을 피한다(비동기/논블로킹 사용, 타임아웃 설정, 동시성 제한 등). * 에러 처리 기능을 신중하게 테스트한다. -* 서킷 브레이커, 격벽(bulkhead), 재시도 로직(retry logic), 우아한 성능 저하(graceful degradation)와 같은 복원력 패턴을 구현한다. +* 서킷 브레이커, 격벽(bulkhead), 재시도 로직, 우아한 성능 저하(graceful degradation)와 같은 복원력 패턴을 구현한다. * 성능 및 부하 테스트를 수행한다. 조직의 위험 수용 범위 내에서 카오스 엔지니어링을 도입한다. -* 합리적이고 비용적으로 감당 가능한 범위에서 이중화(redundancy)를 구현하고, 이를 전제로 아키텍처를 설계한다. +* 합리적이고 비용적으로 감당 가능한 범위에서 이중화를 구현하고, 이를 전제로 아키텍처를 설계한다. * 모니터링, 옵저버빌리티, 알림을 구현한다. * RFC 2267을 준수해 잘못된 발신자 주소를 필터링한다. * 핑거프린트, IP 또는 행위 기반 동적 탐지로 알려진 봇넷을 차단한다. -* 작업 증명(Proof-of-Work)을 적용하여 자원 소모 작업을 서버가 아니라 *공격자* 측에 부과한다. 정상 사용자 경험에 미치는 영향은 최소화하고, 시스템 부하가 상승할수록 자격증명 난이도를 높이고, 특히 신뢰도가 낮거나 봇으로 판단되는 트래픽에는 더 높은 난이도를 적용한다. +* 작업 증명(Proof-of-Work)을 적용하여 자원 소모 작업을 서버가 아니라 *공격자* 측에 부과한다. 정상 사용자 경험에 미치는 영향은 최소화하고, 시스템 부하가 상승할수록 작업 증명 난이도를 높이고, 특히 신뢰도가 낮거나 봇으로 판단되는 트래픽에는 더 높은 난이도를 적용한다. * 비활성 시간과 최종 타임아웃을 기준으로 서버 측 세션 시간을 제한한다. * 세션에 저장되는 상태 정보는 최소화한다. @@ -219,7 +219,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 * 초기화되지 않은 변수를 사용하는 경우. * 메모리 누수 또는 비정상 메모리 소모로 가용 메모리가 고갈되어 장애로 이어지는 경우. -메모리 관리 실패는 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있으며, 이는 [X01:2025 애플리케이션 복원력 부족](#x012025-lack-of-application-resilience)를 함께 참고한다. +메모리 관리 실패는 애플리케이션뿐만 아니라 심지어 전체 시스템의 장애로 이어질 수 있으며, 이는 [X01:2025 애플리케이션 복원력 부족](#x012025-lack-of-application-resilience)를 함께 참고한다. ### 대응 방안 @@ -242,7 +242,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 * 컴파일러 오류와 경고를 *모두* 수정한다. 프로그램이 컴파일된다고 해서 경고를 무시하지 않는다. * 기반 인프라가 정기적으로 패치, 스캔, 하드닝되도록 보장한다. * 특히 기반 인프라를 대상으로 한 잠재적 메모리 취약점 및 기타 장애 요인을 모니터링한다. -* 오버플로 공격으로부터 주소 스택을 보호하기 위해 [카나리(canaries)](https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries) 사용을 고려한다. +* 오버플로 공격으로부터 주소 스택을 보호하기 위해 [카나리](https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries) 사용을 고려한다. ### 공격 시나리오 예시 @@ -250,7 +250,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 **시나리오 2:** 유즈 에프터 프리(Use-After-Free)은 비교적 자주 발생하여 브라우저 버그 바운티에서 흔히 제보되는 유형의 버그다. 예를 들어 웹 브라우저가 DOM 요소를 조작하는 JavaScript를 처리하는 상황을 가정하자. 공격자는 객체(예: DOM 요소)를 생성하고 그에 대한 참조를 획득하는 JavaScript 페이로드를 작성한다. 이후 정교한 조작을 통해, 브라우저가 해당 객체의 메모리를 해제하도록 유도하면서도 그 객체를 가리키는 댕글링 포인터(dangling pointer)는 유지하게 만든다. 브라우저가 메모리 해제를 인지하기 전에, 공격자는 *동일한* 메모리 공간을 차지하도록 새 객체를 할당한다. 브라우저가 원래 포인터를 사용하면, 이제 그 포인터는 공격자가 삽입한 데이터를 참조하게 된다. 만약 이 포인터가 가상 함수 테이블을 가리키는 것이었다면, 공격자는 코드 실행 흐름을 자신의 페이로드로 리다이렉션할 수 있다. -**시나리오 3:** 사용자 입력을 받아 적절히 검증하거나 정제하지 않고 로깅 함수로 직접 전달하는 네트워크 서비스를 가정해 보자. 사용자 입력은 형식을 지정하는 syslog("%s", user_input) 대신 형식을 지정하지 않은 syslog(user_input) 형태로 로깅 함수에 전달된다. 공격자는 스택 메모리를 읽기 위한(민감한 데이터 노출) %x 또는 메모리 주소에 값을 쓰기 위한 %n과 같은 형식 지정자(format specifier)를 포함한 악성 페이로드를 전송한다. 공격자는 여러 형식 지정자를 결합하여 스택 구조를 파악하고, 중요한 주소를 찾아낸 뒤 이를 덮어쓸 수 있다. 이는 포맷 스트링 취약점(format string vulnerability)에 해당한다. +**시나리오 3:** 사용자 입력을 받아 적절히 검증하거나 정제하지 않고 로깅 함수로 직접 전달하는 네트워크 서비스를 가정해 보자. 사용자 입력은 형식을 지정하는 syslog("%s", user_input) 대신 형식을 지정하지 않은 syslog(user_input) 형태로 로깅 함수에 전달된다. 공격자는 스택 메모리를 읽기 위한(민감한 데이터 노출) %x 또는 메모리 주소에 값을 쓰기 위한 %n과 같은 형식 지정자(format specifier)를 포함한 악성 페이로드를 전송한다. 공격자는 여러 형식 지정자를 결합하여 스택 구조를 파악하고, 중요한 주소를 찾아낸 뒤 이를 덮어쓸 수 있다. 이는 포맷 스트링 취약점에 해당한다. 참고: 현대의 브라우저는 [브라우저 샌드박스](https://www.geeksforgeeks.org/ethical-hacking/what-is-browser-sandboxing/#types-of-browser-sandboxing), ASLR, DEP/NX, RELRO 및 PIE를 포함한 심층적 방어 체계를 사용하기에, 브라우저에 대한 메모리 관리 실패 공격이 쉽지 않다. From 938799840e60ccd0e50b6a94f3f761607d7b72bc Mon Sep 17 00:00:00 2001 From: SeongJin Hong Date: Fri, 9 Jan 2026 01:26:02 +0900 Subject: [PATCH 160/167] Fix links in X01_2025-Next_Steps.md --- 2025/docs/ko/X01_2025-Next_Steps.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/X01_2025-Next_Steps.md b/2025/docs/ko/X01_2025-Next_Steps.md index d1f937519..1522fd819 100644 --- a/2025/docs/ko/X01_2025-Next_Steps.md +++ b/2025/docs/ko/X01_2025-Next_Steps.md @@ -64,7 +64,7 @@ OWASP Top 10은 이름 그대로 가장 중요한 10가지 위험으로만 선 이 카테고리는 애플리케이션이 스트레스, 장애 및 엣지 케이스에 대응하는 방식 전반에 존재하는 시스템적 약점을 의미하며, 그 결과 장애 발생 시 애플리케이션이 정상 상태로 복구하지 못할 수 있다. 애플리케이션이 예기치 않은 조건, 리소스 제약 및 기타 불리한 이벤트를 우아하게(gracefully) 처리하지 못하거나, 견디지 못하거나, 또는 복구하지 못할 경우, 가용성 문제(일반적으로)로 이어지며, 그 외에도 데이터 손상, 민감 데이터 노출, 연쇄 장애 또는 보안 통제 우회를 유발할 수 있다. -또한 [X02:2025 메모리 관리 실패](#x022025-memory-management-failures) 역시 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있다. +또한 [X02:2025 메모리 관리 실패](#x022025) 역시 애플리케이션, 또는 심지어 전체 시스템의 장애로 이어질 수 있다. ### 대응 방안 @@ -219,7 +219,7 @@ Java, C#, JavaScript/TypeScript(Node.js), Go, 그리고 "안전한" Rust와 같 * 초기화되지 않은 변수를 사용하는 경우. * 메모리 누수 또는 비정상 메모리 소모로 가용 메모리가 고갈되어 장애로 이어지는 경우. -메모리 관리 실패는 애플리케이션뿐만 아니라 심지어 전체 시스템의 장애로 이어질 수 있으며, 이는 [X01:2025 애플리케이션 복원력 부족](#x012025-lack-of-application-resilience)를 함께 참고한다. +메모리 관리 실패는 애플리케이션뿐만 아니라 심지어 전체 시스템의 장애로 이어질 수 있으며, 이는 [X01:2025 애플리케이션 복원력 부족](#x012025)를 함께 참고한다. ### 대응 방안 From 8aa810bab7485da83bfbf00623ed858c7501fd84 Mon Sep 17 00:00:00 2001 From: woohyun <43837268+woohyun212@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:20:08 +0900 Subject: [PATCH 161/167] Fix missing bold formatting for 2025 in index.md (issue #45) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 불필요한 쉼표 제거 --- 2025/docs/ko/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2025/docs/ko/index.md b/2025/docs/ko/index.md index 274543e12..036ce88e3 100644 --- a/2025/docs/ko/index.md +++ b/2025/docs/ko/index.md @@ -6,10 +6,10 @@ OWASP Top 10은 개발자와 웹 애플리케이션 보안을 위한 인식 제 ## 이번 버전 소개 -이 문서는 OWASP Top 10의 2025년 버전이다. 최신 데이터와 보안 동향을 반영하여 업데이트되었다. +이 문서는 OWASP Top 10의 **2025**년 버전이다. 최신 데이터와 보안 동향을 반영하여 업데이트되었다. ## 메인 프로젝트 페이지 -[메인 프로젝트 페이지](https://github.com/OWASP/www-project-top-ten)에는 과거 자료를 포함한, 해당 프로젝트의 메타데이터가 정리되어 있다. +[메인 프로젝트 페이지](https://github.com/OWASP/www-project-top-ten)에는 과거 자료를 포함한 해당 프로젝트의 메타데이터가 정리되어 있다. ## 시작하기 From 5cd0fa288695181e3232f0aa9af3fb1791d38ea7 Mon Sep 17 00:00:00 2001 From: ben-cremit Date: Sun, 11 Jan 2026 23:36:05 +0900 Subject: [PATCH 162/167] issue refelect --- 2025/docs/ko/0x00_2025-Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 721dfc7c8..6aecd4a27 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -26,7 +26,7 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ## 2025년 Top 10의 변화 -2025년 Top 10에는 두 개의 신규 카테고리가 추가되고 하나의 카테고리가 통합되었다. 저희는 가능한 한 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. +2025년 Top 10에는 두 개의 신규 카테고리가 추가되고 하나의 카테고리가 통합되었다. 이번 업데이트에서는 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. ![Mapping](../assets/Top10Mapping-ko.png) From 86b1e2ed5c244f4ec27d3ffd461e5391890c0709 Mon Sep 17 00:00:00 2001 From: "Ben.DH.Kim" Date: Mon, 12 Jan 2026 00:21:25 +0900 Subject: [PATCH 163/167] =?UTF-8?q?Improve=20Korean=20translation:=20remov?= =?UTF-8?q?e=20awkward=20"=EC=A0=80=ED=9D=AC=EB=8A=94"=20and=20"=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=9C=20=ED=95=9C"=20for=20better=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2025/docs/ko/0x00_2025-Introduction.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/2025/docs/ko/0x00_2025-Introduction.md b/2025/docs/ko/0x00_2025-Introduction.md index 6aecd4a27..f356f005f 100644 --- a/2025/docs/ko/0x00_2025-Introduction.md +++ b/2025/docs/ko/0x00_2025-Introduction.md @@ -26,7 +26,8 @@ OWASP Top 10의 8번째 버전에 오신 것을 환영합니다! ## 2025년 Top 10의 변화 -2025년 Top 10에는 두 개의 신규 카테고리가 추가되고 하나의 카테고리가 통합되었다. 이번 업데이트에서는 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 어느 정도 중복이 없는 10개의 카테고리를 만드는 것은 사실상 불가능했다. +2025년 Top 10에는 두 개의 신규 카테고리가 추가되고 하나의 카테고리가 통합되었으며, 증상보다는 근본 원인에 초점을 두었다. 소프트웨어 엔지니어링과 소프트웨어 보안의 복잡성을 고려할 때, 서로 중복되지 않는 10개의 카테고리를 만드는 것은 사실상 불가능했다. + ![Mapping](../assets/Top10Mapping-ko.png) From ffe2ec10b53cb6db337391c676a62699fde57914 Mon Sep 17 00:00:00 2001 From: SeoIn Yeo Date: Tue, 13 Jan 2026 19:48:29 +0900 Subject: [PATCH 164/167] Update 0x02_2025-What_are_Application_Security_Risks.md (#52) --- 2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md index e7c80153b..df16bc6a1 100644 --- a/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md +++ b/2025/docs/ko/0x02_2025-What_are_Application_Security_Risks.md @@ -47,7 +47,7 @@ -본 위험 등급은 악용 가능성, 취약점에서 보안 통제가 누락되어 있을 가능성의 평균, 그리고 기술적 영향을 공통 평가 요소로 산정에 반영하였다. +본 위험 등급은 악용 가능성, 보안 통제가 누락될 가능성의 평균, 그리고 기술적 영향을 공통 평가 요소로 반영하여 산정되었다. 조직은 각기 고유하며, 해당 조직을 대상으로 하는 위협 행위자, 그들의 목표, 그리고 침해 발생 시 영향도 또한 고유하다. 공익 단체가 대외 정보 제공을 위해 콘텐츠 관리 시스템(Content Management System, CMS)을 사용하는 경우와, 의료 시스템에서 동일한 CMS를 민감한 의료 정보에 사용하는 경우를 비교하면, 같은 소프트웨어라 하더라도 위협 행위자와 비즈니스 영향은 크게 달라질 수 있다. 애플리케이션의 노출 수준, 상황별 위협 행위자(비즈니스 및 지역에 따른 표적 공격과 비표적 공격), 그리고 개별 비즈니스 영향을 바탕으로 조직의 위험을 이해하는 것이 중요하다. From cda654b7e2c9eb6f91427de0bb515b8310fba970 Mon Sep 17 00:00:00 2001 From: SeoIn Yeo Date: Tue, 13 Jan 2026 19:50:13 +0900 Subject: [PATCH 165/167] Update A04 2025 cryptographic failures.md --- 2025/docs/ko/A04_2025-Cryptographic_Failures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A04_2025-Cryptographic_Failures.md b/2025/docs/ko/A04_2025-Cryptographic_Failures.md index 107850186..13958ce43 100644 --- a/2025/docs/ko/A04_2025-Cryptographic_Failures.md +++ b/2025/docs/ko/A04_2025-Cryptographic_Failures.md @@ -95,7 +95,7 @@ * 민감 데이터가 포함된 응답의 캐싱을 비활성화한다. 이는 콘텐츠 전송 네트워크(CDN), 웹 서버, 모든 애플리케이션 캐싱(예: Redis)을 포함한다. * 데이터 분류에 따라 필요한 보안 통제를 적용한다. * FTP 나 STARTTLS 같은 암호화되지 않는 프로토콜을 사용하지 않는다. SMTP로 기밀 정보를 전송하는 것은 피한다. -* 패스워드는 작업 인자(delay factor)를 갖춘 강력한 적응형 솔트 해싱 함수를 사용해 저장한다. Argon2, yescrypt, scrypt, PBKDF2-HMAC-SHA-512 등이 있다. 레거시 시스템에서 bcrypt를 사용하는 경우 [OWASP Cheat Sheet: Password Storage](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)를 참고한다. +* 패스워드는 작업 요소(지연 요소)를 갖춘 강력한 적응형 솔트 해싱 함수를 사용해 저장한다. Argon2, yescrypt, scrypt, PBKDF2-HMAC-SHA-512 등이 있다. 레거시 시스템에서 bcrypt를 사용하는 경우 [OWASP Cheat Sheet: Password Storage](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)를 참고한다. * 초기화 벡터(IV)는 운영 모드에 적합하게 선택해야 한다. 이는 CSPRNG(Cryptographically Secure Pseudo Random Number Generator) 사용을 의미할 수 있다. 논스(nonce)를 요구하는 모드의 경우 IV에 CSPRNG가 필요하지 않다. 모든 경우에 IV는 고정 키에 대해 두 번 사용해서는 안 된다. * 기본 암호화 대신 항상 인증 암호화(Authenticated Encryption)를 사용한다. * 키는 암호학적으로 무작위로 생성하고, 메모리에 바이트 배열로 저장해야 한다. 패스워드를 암호키로 사용하는 경우 적절한 패스워드 기반 키 파생 함수(PBKDF)를 통해 키로 변환해야 한다. From 6ebeb9ca23203f5cb801d3fde740fcaaea5a12bd Mon Sep 17 00:00:00 2001 From: SeoIn Yeo Date: Tue, 13 Jan 2026 19:50:36 +0900 Subject: [PATCH 166/167] Update A06_2025-Insecure_Design.md --- 2025/docs/ko/A06_2025-Insecure_Design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A06_2025-Insecure_Design.md b/2025/docs/ko/A06_2025-Insecure_Design.md index 0e21b4daf..faa137cb4 100644 --- a/2025/docs/ko/A06_2025-Insecure_Design.md +++ b/2025/docs/ko/A06_2025-Insecure_Design.md @@ -57,7 +57,7 @@ ## 설명 -안전하지 않은 설계는 다양한 유형의 약점을 포괄하는 범주로, 주로 "빠졌거나 비효과적인 통제 설계"로 나타난다. 또한 이 카테고리가 다른 모든 Top 10 위험의 근본 원인이라고 보기는 어렵다. 안전하지 않은 설계와 안전하지 않은 구현은 차이가 있어 구분되어야 하며, 설계 결함과 구현 결함은 근본 원인이 다르며, 개발 과정에서의 발생 시점이 다르고, 그리고 개선 방법도 다르다. 안전한 설계를 하더라도 구현상 결함을 가질 수 있으며, 이에 따라 취약점이 발생할 수 있다. 안전하지 않은 설계는 필요한 보안 통제가 특정 공격에 대해 방어하기 위해 대비되지 않았기 때문에, 완벽한 구현만으로는 수정될 수 없다. 안전하지 않은 설계의 원인 중 하나는 개발 대상 소프트웨어 및 시스템에 대한 비즈니스 리스크 프로파일링이 부족한 것이며, 그 결과 요구되는 보안 설계 수준을 적절히 산정하지 못하는 것이다. +안전하지 않은 설계는 다양한 유형의 약점을 포괄하는 범주로, 주로 "누락되었거나 비효과적인 통제 설계"로 나타난다. 또한 이 카테고리가 다른 모든 Top 10 위험의 근본 원인이라고 보기는 어렵다. 안전하지 않은 설계와 안전하지 않은 구현은 차이가 있어 구분되어야 하며, 설계 결함과 구현 결함은 근본 원인이 다르며, 개발 과정에서의 발생 시점이 다르고, 그리고 개선 방법도 다르다. 안전한 설계를 하더라도 구현상 결함을 가질 수 있으며, 이에 따라 취약점이 발생할 수 있다. 안전하지 않은 설계는 필요한 보안 통제가 특정 공격에 대해 방어하기 위해 대비되지 않았기 때문에, 완벽한 구현만으로는 수정될 수 없다. 안전하지 않은 설계의 원인 중 하나는 개발 대상 소프트웨어 및 시스템에 대한 비즈니스 리스크 프로파일링이 부족한 것이며, 그 결과 요구되는 보안 설계 수준을 적절히 산정하지 못하는 것이다. 보안 설계를 갖추기 위한 세 가지 핵심 구성요소는 다음과 같다. From b02d0a684eba03587af3cdf0506986e48ab56e93 Mon Sep 17 00:00:00 2001 From: SeoIn Yeo Date: Tue, 13 Jan 2026 19:51:00 +0900 Subject: [PATCH 167/167] Update A07_2025-Authentication_Failures.md --- 2025/docs/ko/A07_2025-Authentication_Failures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2025/docs/ko/A07_2025-Authentication_Failures.md b/2025/docs/ko/A07_2025-Authentication_Failures.md index a1e28ac38..755edd13c 100644 --- a/2025/docs/ko/A07_2025-Authentication_Failures.md +++ b/2025/docs/ko/A07_2025-Authentication_Failures.md @@ -58,7 +58,7 @@ 공격자가 시스템을 속여 유효하지 않거나 잘못된 사용자 정보를 정상 사용자로 인증되도록 만들 수 있는 경우, 해당 취약점이 존재한다고 판단한다. 특히 애플리케이션이 아래와 같은 행위를 실질적으로 방어하지 못하면 인증 관련 약점이 있을 수 있다. -* 공격자가 유효한 사용자명과 비밀번호의 유출 목록을 보유한 상태에서 수행하는 크리덴셜 스터핑(credential stuffing)과 같은 자동화 공격을 방어하지 못하는 경우. 최근에는 이러한 유형의 공격이 하이브리드 비밀번호 공격(일명 비밀번호 스프레이 공격)까지로 확장되었는데, 이는 공격자가 유출된 자격 증명의 변형 또는 숫자를 더하는 방법을 사용하여 접근 권한을 획득하는 방식이다. 예를 들어 획득된 비밀번호가 Password1!인 경우 Password2!, Password3! 등을 순차적으로 시도하는 것이다. +* 공격자가 유출된 사용자명과 비밀번호 목록을 이용해 수행하는 크리덴셜 스터핑(credential stuffing)과 같은 자동화 공격을 방어하지 못하는 경우. 최근에는 이러한 공격 유형이 하이브리드 비밀번호 공격(비밀번호 스프레이 공격)으로 확장되었으며, 공격자가 유출된 자격 증명을 변형하거나 숫자를 추가하여 접근 권한을 획득하는 방식이다. 예를 들어 획득된 비밀번호가 Password1!인 경우 Password2!, Password3! 등을 순차적으로 시도하는 것이다. * 무차별 대입(brute force) 또는 기타 자동화된 스크립트 기반 공격을 방어하지 못하는 경우 혹은 이러한 공격이 신속하게 차단되지 않는 경우.