-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #81 from kantabile/trans/python-vulnerability-03-05
2631, 3329, 4423, 4426, 4433, 4830
- Loading branch information
Showing
6 changed files
with
434 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
--- | ||
title: 정규식은 서비스 거부 공격에 취약하지 않아야 합니다. | ||
|
||
tags: | ||
- Vulnerability | ||
- Critical | ||
- injection | ||
- cwe | ||
- owasp | ||
- denial-of-service | ||
- python | ||
--- | ||
|
||
대부분의 정규식 엔진은 입력을 평가할 때 백트래킹을 사용하여 정규식의 가능한 모든 실행 경로를 시도하는데, | ||
경우에 따라 치명적인 백트래킹 상황이라고 하는 성능 문제를 일으킬 수 있습니다. | ||
최악의 경우 정규식의 복잡성은 입력의 크기에 따라 기하급수적으로 증가하므로, | ||
20자와 같이 신중하게 만들어진 작은 입력도 치명적인 백트래킹을 유발하여 애플리케이션의 서비스 거부를 일으킬 수 있습니다. | ||
초선형 정규식의 복잡성은 신중하게 만들어진 큰 입력(수천 개의 문자)에서도 동일한 영향을 미칠 수 있습니다. | ||
|
||
사용자 제어 입력에서 정규식 패턴을 구성하는 것은 권장하지 않으며, 다른 선택의 여지가 없는 경우 정규식 메타문자를 제거/소멸하기 위해 입력을 위생 처리하는 것이 좋습니다. | ||
|
||
|
||
### 규칙을 어긴 코드 | ||
|
||
```python | ||
from flask import request | ||
import re | ||
|
||
@app.route('/upload') | ||
def upload(): | ||
username = request.args.get('username') | ||
filename = request.files.get('attachment').filename | ||
|
||
re.search(username, filename) # 규칙을 어긴 코드 | ||
``` | ||
|
||
|
||
### 규칙을 준수한 해결책 | ||
```python | ||
from flask import request | ||
import re | ||
|
||
@app.route('/upload') | ||
def upload(): | ||
username = re.escape(request.args.get('username')) | ||
filename = request.files.get('attachment').filename | ||
|
||
re.search(username, filename) # 규칙을 준수한 코드 | ||
``` | ||
|
||
|
||
### 같이보면 좋은 자료드 | ||
- [OWASP Top 10 2021 Category A3](https://owasp.org/Top10/A03_2021-Injection/) - 인젝션 | ||
- [OWASP Top 10 2017 Category A1](https://owasp.org/www-project-top-ten/2017/A1_2017-Injection) - 인젝션 | ||
- [MITRE, CWE-20](https://cwe.mitre.org/data/definitions/20) - 부적절한 입력 검증 | ||
- [MITRE, CWE-400](https://cwe.mitre.org/data/definitions/400) - 제어되지 않는 리소스 소비 | ||
- [MITRE, CWE-1333](https://cwe.mitre.org/data/definitions/1333) - 비효율적인 정규식 복잡성 | ||
- [OWASP Regular expression Denial of Service - ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS) | ||
--- | ||
|
||
|
||
If you like SONARKUBE, don't forget to give me a star. :star2: | ||
|
||
> [원문으로 바로가기](https://rules.sonarsource.com/python/type/Vulnerability/RSPEC-2631) | ||
> [![Star This Project](https://img.shields.io/github/stars/kantabile/sonarkube.svg?label=Stars&style=social)](https://github.com/kantabile/sonarkube) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
--- | ||
title: 암호 블록 체인 IV는 예측할 수 없어야 합니다. | ||
tags: | ||
- Vulnerability | ||
- Critical | ||
- cwe | ||
- owasp | ||
- python | ||
--- | ||
|
||
암호 블록 체인(CBC) 모드로 데이터를 암호화할 때 초기화 벡터(IV)를 사용하여 암호화를 무작위로 생성합니다. | ||
즉, 주어진 키 아래에서 동일한 평문이 항상 동일한 암호문을 생성하지는 않습니다. | ||
IV는 비밀일 필요는 없지만 '선택된 일반 텍스트 공격'을 피하기 위해 예측할 수 없어야 합니다. | ||
|
||
초기화 벡터를 생성하려면 안전한 난수 생성기를 사용할 것을 NIST는 권장합니다. | ||
|
||
|
||
### 규칙을 어긴 코드 | ||
[PyCryptodome](https://github.com/Legrandin/pycryptodome) 모듈의 경우 | ||
```python | ||
from Crypto.Cipher import AES | ||
from Crypto.Random import get_random_bytes | ||
from Crypto.Util.Padding import pad, unpad | ||
|
||
static_vector = b'x' * AES.block_size | ||
cipher = AES.new(key, AES.MODE_CBC, static_vector) | ||
cipher.encrypt(pad(data, AES.block_size)) # 규칙을 어긴 코드 | ||
``` | ||
[cryptography](https://github.com/pyca/cryptography) 모듈의 경우 | ||
```python | ||
from os import urandom | ||
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes | ||
|
||
static_vector = b'x' * 16 | ||
cipher = Cipher(algorithms.AES(key), modes.CBC(static_vector)) | ||
cipher.encryptor() # 규칙을 어긴 코드 | ||
``` | ||
|
||
|
||
### 규칙을 준수한 해결책 | ||
[PyCryptodome](https://github.com/Legrandin/pycryptodome) 모듈의 경우 | ||
```python | ||
from Crypto.Cipher import AES | ||
from Crypto.Random import get_random_bytes | ||
from Crypto.Util.Padding import pad, unpad | ||
|
||
random_vector = get_random_bytes(AES.block_size) | ||
cipher = AES.new(key, AES.MODE_CBC, random_vector) | ||
cipher.encrypt(pad(data, AES.block_size)) | ||
``` | ||
[cryptography](https://github.com/pyca/cryptography) 모듈의 경우 | ||
```python | ||
from os import urandom | ||
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes | ||
|
||
random_vector = urandom(16) | ||
cipher = Cipher(algorithms.AES(key), modes.CBC(random_vector)) | ||
cipher.encryptor() | ||
``` | ||
|
||
|
||
### 같이보면 좋은 자료드 | ||
- [OWASP Top 10 2021 Category A2](https://owasp.org/Top10/A02_2021-Cryptographic_Failures/) - 암호화 실패 | ||
- [OWASP Top 10 2017 Category A3](https://www.owasp.org/www-project-top-ten/2017/A3_2017-Sensitive_Data_Exposure) - 민감한 데이터 노출 | ||
- [OWASP Top 10 2017 Category A6](https://owasp.org/www-project-top-ten/2017/A6_2017-Security_Misconfiguration) - 보안 구성 오류 | ||
- [Mobile AppSec Verification Standard](https://mobile-security.gitbook.io/masvs/security-requirements/0x08-v3-cryptography_verification_requirements) - 암호화 요구 사항 | ||
- [OWASP Mobile Top 10 2016 Category M5](https://owasp.org/www-project-mobile-top-10/2016-risks/m5-insufficient-cryptography) - 암호화 불충분 | ||
- [MITRE, CWE-329](https://cwe.mitre.org/data/definitions/329) - CBC 모드에서 예측할 수 없는 IV를 사용하지 않음 | ||
- [NIST, SP-800-38A](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf) - 블록 사이퍼 작동 모드에 대한 권장 사항 | ||
--- | ||
|
||
|
||
If you like SONARKUBE, don't forget to give me a star. :star2: | ||
|
||
> [원문으로 바로가기](https://rules.sonarsource.com/python/type/Vulnerability/RSPEC-3329) | ||
> [![Star This Project](https://img.shields.io/github/stars/kantabile/sonarkube.svg?label=Stars&style=social)](https://github.com/kantabile/sonarkube) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
--- | ||
title: 취약한 SSL/TLS 프로토콜을 사용해서는 안 됩니다. | ||
tags: | ||
- Vulnerability | ||
- Critical | ||
- cwe | ||
- privacy | ||
- owasp | ||
- sans-top25 | ||
- python | ||
--- | ||
|
||
이 규칙은 안전하지 않은 TLS 프로토콜 버전("TLSv1.2", "TLSv1.3", "DTLSv1.2" 또는 "DTLSv1.3"과 다른 프로토콜)이 사용되거나 허용될 때 문제를 제기합니다. | ||
|
||
최소 프로토콜 버전으로 TLS 1.2를 적용하고 TLS 1.0과 같은 이전 버전은 허용하지 않는 것이 좋습니다. 그렇게 하지 않으면 다운그레이드 공격에 노출될 수 있습니다. | ||
연결을 가로챌 수 있는 악의적인 공격자가 요청된 프로토콜 버전을 수정하여 보안이 낮은 버전으로 다운그레이드할 수 있습니다. | ||
|
||
대부분의 경우 기본 시스템 구성을 사용하는 것은 규정을 준수하지 않습니다. | ||
실제로 애플리케이션이 다양한 구성을 가진 다양한 시스템에 배포될 수 있습니다. 최신 최신 시스템에서는 시스템의 기본값을 사용하는 것이 안전할 수 있지만, | ||
구형 시스템에서는 그렇지 않을 수 있습니다. 따라서 모든 경우에 명시적으로 안전한 구성을 설정하는 것이 좋습니다. | ||
|
||
### 규칙을 어긴 코드 | ||
```python | ||
from OpenSSL import SSL | ||
|
||
SSL.Context(SSL.SSLv3_METHOD) # 규칙을 어긴 코드 | ||
``` | ||
```python | ||
import ssl | ||
|
||
ssl.SSLContext(ssl.PROTOCOL_SSLv3) # 규칙을 어긴 코드 | ||
``` | ||
aws_cdk.aws_apigateway.DomainNamed 의 경우: | ||
```python | ||
from aws_cdk.aws_apigateway import DomainName, SecurityPolicy | ||
class ExampleStack(Stack): | ||
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: | ||
super().__init__(scope, construct_id, **kwargs) | ||
DomainName(self, "example", | ||
domain_name="example.com", | ||
certificate=certificate, | ||
security_policy=SecurityPolicy.TLS_1_0 # 규칙을 어긴 코드 | ||
) | ||
``` | ||
aws_cdk.aws_opensearchservice.CfnDomain 의 경: | ||
```python | ||
from aws_cdk.aws_opensearchservice import CfnDomain, EngineVersion | ||
class ExampleStack(Stack): | ||
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: | ||
super().__init__(scope, construct_id, **kwargs) | ||
CfnDomain(self, "example", | ||
version=EngineVersion.OPENSEARCH_1_3 | ||
) # 규칙을 어긴 코드: 더 이상 사용되지 않는 프로토콜 버전인 TLS 1.0을 활성화합니다. | ||
``` | ||
|
||
|
||
### 규칙을 준수한 해결책 | ||
```python | ||
from OpenSSL import SSL | ||
|
||
context = SSL.Context(SSL.TLS_SERVER_METHOD) | ||
context.set_min_proto_version(SSL.TLS1_3_VERSION) | ||
``` | ||
```python | ||
import ssl | ||
|
||
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) | ||
context.minimum_version = ssl.TLSVersion.TLSv1_3 | ||
``` | ||
aws_cdk.aws_apigateway.DomainNamed 의 경우: | ||
```python | ||
from aws_cdk.aws_apigateway import DomainName, SecurityPolicy | ||
class ExampleStack(Stack): | ||
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: | ||
super().__init__(scope, construct_id, **kwa우rgs) | ||
DomainName(self, "example", | ||
domain_name="example.com", | ||
certificate=certificate, | ||
security_policy=SecurityPolicy.TLS_1_2 | ||
) | ||
``` | ||
aws_cdk.aws_opensearchservice.CfnDomain 의 경우: | ||
```python | ||
from aws_cdk.aws_opensearchservice import CfnDomain, EngineVersion | ||
class ExampleStack(Stack): | ||
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: | ||
super().__init__(scope, construct_id, **kwargs) | ||
CfnDomain(self, "example", | ||
version=EngineVersion.OPENSEARCH_1_3 | ||
domain_endpoint_options=CfnDomain.DomainEndpointOptionsProperty( | ||
tls_security_policy="Policy-Min-TLS-1-2-2019-07" | ||
) | ||
) | ||
``` | ||
|
||
|
||
### 같이보면 좋은 자료드 | ||
- [OWASP Top 10 2021 Category A2](https://owasp.org/Top10/A02_2021-Cryptographic_Failures/) - 암호화 실패 | ||
- [OWASP Top 10 2021 Category A7](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/) - 식별 및 인증 실패 | ||
- [OWASP Top 10 2017 Category A3](https://www.owasp.org/www-project-top-ten/2017/A3_2017-Sensitive_Data_Exposure) - 민감한 데이터 노출 | ||
- [OWASP Top 10 2017 Category A6](https://owasp.org/www-project-top-ten/2017/A6_2017-Security_Misconfiguration) - 보안 구성 오류 | ||
- [Mobile AppSec Verification Standard](https://mobile-security.gitbook.io/masvs/security-requirements/0x10-v5-network_communication_requirements) - 네트워크 통신 요구 사항 | ||
- [OWASP Mobile Top 10 2016 Category M3](https://owasp.org/www-project-mobile-top-10/2016-risks/m3-insecure-communication) - 안전하지 않은 통신 | ||
- [MITRE, CWE-327](https://cwe.mitre.org/data/definitions/326) - 부적절한 암호화 강도 | ||
- [MITRE, CWE-326](https://cwe.mitre.org/data/definitions/327) - 깨지거나 위험한 암호화 알고리즘 사용 | ||
- [SANS Top 25](https://www.sans.org/top25-software-errors/#cat3) - 다공성 방어 | ||
- [SSL and TLS Deployment Best Practices](https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices#22-use-secure-protocols) - 보안 프로토콜 사용 | ||
- [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-custom-domain-tls-version.html) - 최소 TLS 버전 선택하기 | ||
--- | ||
|
||
|
||
If you like SONARKUBE, don't forget to give me a star. :star2: | ||
|
||
> [원문으로 바로가기](https://rules.sonarsource.com/python/type/Vulnerability/RSPEC-4423) | ||
> [![Star This Project](https://img.shields.io/github/stars/kantabile/sonarkube.svg?label=Stars&style=social)](https://github.com/kantabile/sonarkube) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
--- | ||
title: 암호화 키 생성은 강력한 매개 변수를 기반으로 해야 합니다. | ||
tags: | ||
- Vulnerability | ||
- Critical | ||
- cwe | ||
- privacy | ||
- owasp | ||
- python | ||
--- | ||
|
||
암호화 키(또는 키 쌍)를 생성할 때는 강력한 매개변수를 사용하는 것이 중요합니다. 예를 들어 키 길이는 무차별 암호 대입 공격에 대해 충분한 엔트로피를 제공해야 합니다. | ||
|
||
- RSA 및 DSA 알고리즘의 경우 키 크기는 2048비트 이상이어야 합니다. | ||
- ECC(타원 곡선 암호화) 알고리즘의 경우 키 크기는 224비트 이상이어야 합니다. | ||
- RSA 공개 키의 경우 공개 키 지수는 65537 이상이어야 합니다. | ||
|
||
이 규칙은 약한 매개변수를 사용하여 RSA, DSA 또는 ECC 키 쌍 생성기를 초기화할 때 문제가 발생합니다. | ||
|
||
다음 라이브러리를 지원합니다: | ||
- [cryptography](https://github.com/pyca/cryptography) | ||
- [PyCrypto](https://github.com/dlitz/pycrypto) | ||
- [Cryptodome](https://github.com/Legrandin/pycryptodome) | ||
|
||
### 규칙을 어긴 코드 | ||
```python | ||
from cryptography.hazmat.primitives.asymmetric import rsa, ec, dsa | ||
|
||
dsa.generate_private_key(key_size=1024, backend=backend) # 규칙을 어긴 코드 | ||
rsa.generate_private_key(public_exponent=999, key_size=2048, backend=backend) # 규칙을 어긴 코드 | ||
ec.generate_private_key(curve=ec.SECT163R2, backend=backend) # 규칙을 어긴 코드 | ||
``` | ||
|
||
### 규칙을 준수한 해결책 | ||
```python | ||
from cryptography.hazmat.primitives.asymmetric import rsa, ec, dsa | ||
|
||
dsa.generate_private_key(key_size=2048, backend=backend) # 규칙을 준수한 코드 | ||
rsa.generate_private_key(public_exponent=65537, key_size=2048, backend=backend) # 규칙을 준수한 코드 | ||
ec.generate_private_key(curve=ec.SECT409R1, backend=backend) # 규칙을 준수한 코드 | ||
``` | ||
|
||
|
||
### 같이보면 좋은 자료드 | ||
- [OWASP Top 10 2021 Category A2](https://owasp.org/Top10/A02_2021-Cryptographic_Failures/) - 암호화 실패 | ||
- [OWASP Top 10 2017 Category A3](https://www.owasp.org/www-project-top-ten/2017/A3_2017-Sensitive_Data_Exposure) - 민감한 데이터 노출 | ||
- [OWASP Top 10 2017 Category A6](https://owasp.org/www-project-top-ten/2017/A6_2017-Security_Misconfiguration) - 보안 구성 오류 | ||
- [ANSSI RGSv2](https://www.ssi.gouv.fr/uploads/2014/11/RGS_v-2-0_B1.pdf) - 국제 보안 표준 버전 2 | ||
- [NIST FIPS 186-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf) - 디지털 서명 표준(DSS) | ||
- [MITRE, CWE-326](https://cwe.mitre.org/data/definitions/326) - 부적절한 암호화 강도 | ||
--- | ||
|
||
|
||
If you like SONARKUBE, don't forget to give me a star. :star2: | ||
|
||
> [원문으로 바로가기](https://rules.sonarsource.com/python/type/Vulnerability/RSPEC-4426) | ||
> [![Star This Project](https://img.shields.io/github/stars/kantabile/sonarkube.svg?label=Stars&style=social)](https://github.com/kantabile/sonarkube) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
--- | ||
title: LDAP 연결은 인증되어야 합니다. | ||
tags: | ||
- Vulnerability | ||
- Critical | ||
- cwe | ||
- owasp | ||
- python | ||
--- | ||
|
||
LDAP 클라이언트는 [간단한 인증 방법](https://ldapwiki.com/wiki/Simple%20Authentication)을 제공하는 '바인드 요청'을 통해 LDAP 서버에 인증합니다. | ||
|
||
LDAP의 간편 인증은 세 가지 메커니즘으로 사용할 수 있습니다: | ||
|
||
- 길이가 0인 사용자 이름 및 비밀번호 값으로 바인드 요청을 수행하는 익명 인증 메커니즘. | ||
- 길이가 0인 비밀번호 값으로 바인드 요청을 수행하여 인증되지 않은 인증 메커니즘. | ||
- 길이가 0이 아닌 비밀번호 값으로 바인드 요청을 수행하여 이름/비밀번호 인증 메커니즘. | ||
|
||
익명 바인드와 인증되지 않은 바인드는 비밀번호를 제공하지 않고도 LDAP 디렉터리의 정보에 액세스할 수 있으므로 사용을 권장하지 않습니다. | ||
|
||
### 규칙을 어긴 코드 | ||
```python | ||
import ldap | ||
|
||
def init_ldap(): | ||
connect = ldap.initialize('ldap://example:1389') | ||
|
||
connect.simple_bind('cn=root') # 규칙을 어긴 코드 | ||
connect.simple_bind_s('cn=root') # 규칙을 어긴 코드 | ||
connect.bind_s('cn=root', None) # 규칙을 어긴 코드 | ||
connect.bind('cn=root', None) # 규칙을 어긴 코드 | ||
``` | ||
|
||
### 규칙을 준수한 해결책 | ||
```python | ||
import ldap | ||
import os | ||
|
||
def init_ldap(): | ||
connect = ldap.initialize('ldap://example:1389') | ||
|
||
connect.simple_bind('cn=root', os.environ.get('LDAP_PASSWORD')) # 규칙을 준수한 코드 | ||
connect.simple_bind_s('cn=root', os.environ.get('LDAP_PASSWORD')) # 규칙을 준수한 코드 | ||
connect.bind_s('cn=root', os.environ.get('LDAP_PASSWORD')) # 규칙을 준수한 코드 | ||
connect.bind('cn=root', os.environ.get('LDAP_PASSWORD')) # 규칙을 준수한 코드 | ||
``` | ||
|
||
|
||
### 같이보면 좋은 자료 | ||
- [OWASP Top 10 2021 Category A7](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/) - 식별 및 인증 실패 | ||
- [OWASP Top 10 2017 Category A2](https://owasp.org/www-project-top-ten/2017/A2_2017-Broken_Authentication) - 인증 실패 | ||
- [MITRE, CWE-521](https://cwe.mitre.org/data/definitions/521) - 취약한 암호 요구 사항 | ||
- [ldapwiki.com](https://ldapwiki.com/wiki/Simple%20Authentication) - 단순 인증 | ||
--- | ||
|
||
|
||
If you like SONARKUBE, don't forget to give me a star. :star2: | ||
|
||
> [원문으로 바로가기](https://rules.sonarsource.com/python/type/Vulnerability/RSPEC-4433) | ||
> [![Star This Project](https://img.shields.io/github/stars/kantabile/sonarkube.svg?label=Stars&style=social)](https://github.com/kantabile/sonarkube) |
Oops, something went wrong.