Skip to content

Commit

Permalink
Merge pull request #81 from kantabile/trans/python-vulnerability-03-05
Browse files Browse the repository at this point in the history
2631, 3329, 4423, 4426, 4433, 4830
  • Loading branch information
bourbonkk authored Sep 16, 2023
2 parents 4b47525 + 1204a29 commit b0f0194
Show file tree
Hide file tree
Showing 6 changed files with 434 additions and 0 deletions.
66 changes: 66 additions & 0 deletions _posts/python/2023-03-05-RSPEC-2631.md
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)
77 changes: 77 additions & 0 deletions _posts/python/2023-03-05-RSPEC-3329.md
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)
116 changes: 116 additions & 0 deletions _posts/python/2023-03-05-RSPEC-4423.md
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)
58 changes: 58 additions & 0 deletions _posts/python/2023-03-05-RSPEC-4426.md
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)
61 changes: 61 additions & 0 deletions _posts/python/2023-03-05-RSPEC-4433.md
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)
Loading

0 comments on commit b0f0194

Please sign in to comment.