[OWASP TOP 10] A02 2021-Cryptographic Failures 정리

Tamszero·2024년 9월 29일

이비전

목록 보기
4/12

A02 : 2021-Cryptographic Failures란?

: 암호화 기술 실패라는 의미로 암호화 기술의 취약점을 다루며, 불안전한 암호화 방식이나 키 관리 실패로 인한 데이터 유출과 보안 위협을 포함한다.
이 카테고리는 잘못된 구현, 알고리즘 선택, 키 노출 등으로 민감한 데이터의 노출까지 발생하는 문제를 강조하며, 보안 강화를 위해 강력한 암호화 표준과 적절한 키 관리가 필요함을 강조한다.
2017년 대비 한 단계 상승해 두 번째 항목으로 선정.

취약점 예시

  1. 내·외부망에 관계없이 데이터가 전송구간에서 평문으로 전송되는 경우(HTTP, FTP, TELNET 등)

  2. 취약한 암호화 프로토콜/알고리즘/컴포넌트 를 사용하는 경우(프로토콜: SSL v2.0, SSL v3.0/알고리즘: DES, RC4, MD5 /컴포넌트:취약한 버전의 openssl 등)

  3. 보안 헤더 설정을 통한 HSTS가 누락된 경우(HSTS : HTTP를 HTTPS로 강제 리다이렉트)

  4. 고정된 암호문을 사용하는 경우(Salt, 일회용 난수 미포함)
    사설 인증서 사용, 인증서와 도메인 불일치

  5. 암호키 관리가 미흡한 경우(소스코드 하드코딩 등)

  6. 예측 가능한 키 생성
    충분한 난수를 사용하지 않아 공격자가 키를 예측할 수 있는 경우(시간 기반 난수/정적 값 사용/시드값이 약한 경우)

예방 방법

  1. 민감한 데이터 저장 최소화
    : 민감한 데이터를 불필요하게 저장하지 말고, 가능한 한 빨리 폐기하거나 PCI DSS 준수 토큰화 또는 절단 사용.

  2. 데이터 암호화
    : 모든 민감한 데이터를 저장 시 암호화

  3. 초기화 벡터
    : 작동 모드에 적합한 초기화 벡터를 선택. 많은 모드에서는 CSPRNG(암호학적으로 안전한 의사 난수 생성기)를 사용해야 하며, 논스가 필요한 모드에서는 초기화 벡터(IV)에 CSPRNG가 필요하지 않다.모든 경우에 IV는 고정된 키에 대해 두 번 사용해서는 X.

  4. 키 생성 및 저장
    : 키는 암호학적으로 랜덤하게 생성되어야 하며, 메모리에서 바이트 배열로 저장되어야 한다.비밀번호를 사용하는 경우, 적절한 비밀번호 기반 키 파생 함수를 통해 키로 변환해야 함.

  1. 옳바른 데이터 분류에 따른 보안 통제 적용
    : 적합한 데이터 분류에 따라 필요한 보안 통제를 적용한다.

CWE - 261 Weak Encoding for Password

: 비밀번호를 안전하게 저장하지 않음으로 인해 발생하는 취약점을 다룬다. 예를 들어, 평문 또는 약한 해싱 알고리즘을 사용하여 비밀번호를 저장하는 경우, 공격자가 쉽게 이를 복원하거나 추측할 수 있다. 이로 인해 사용자 계정이 쉽게 탈취될 수 있다. 안전한 해싱 방법(예: bcrypt, Argon2)을 사용하고, salt를 추가하여 강력한 인코딩을 적용하는 것이 중요하다.

Salt?

: 해시 함수를 사용할 때 비밀번호와 함께 추가되는 무작위 데이터. 이를 통해 해시값이 고유하게 생성되도록 하여 동일한 비밀번호라도 서로 다른 해시값을 만들어냅니다.

'취약한 코드: 비밀번호를 평문으로 저장
def save_password(plain_password):
with open('passwords.txt', 'a') as file:
file.write(plain_password + '\n')

사용자 비밀번호 입력
user_password = input("Enter your password: ")
save_password(user_password)'

CWE-322 Key Exchange without Entity Authentication

: 안전한 키 교환 과정에서 참여자의 신원을 확인하지 않는 취약점을 다룬다. 이로 인해 공격자가 중간자 공격을 통해 통신을 가로채거나 위조할 수 있습니다.
예를 들어, 공격자가 두 사용자 간의 키 교환 과정에 개입하여 자신이 신뢰할 수 있는 사용자처럼 행동할 수 있다. 이를 방지하기 위해서는 키 교환 과정에서 양측의 신원을 확인하는 인증 메커니즘(예: 디지털 서명, 인증서 사용)을 도입해야 함.

'취약한 코드: 인증 없는 키 교환
def key_exchange():
 
Alice와 Bob 간의 키 교환
alice_private_key = "Alice's private key"
bob_public_key = "Bob's public key"

키 교환
shared_key = alice_private_key + bob_public_key
return shared_key

shared_key = key_exchange()
print("Shared Key:", shared_key)'

CWE 324 - Use of a Key Past its Expiration Date

: 암호화 키가 만료된 후에도 계속 사용되는 취약점을 의미. 만료된 키를 사용하면 보안성이 저하되고, 공격자가 해당 키를 악용할 수 있는 위험이 증가한다.

CWE 328 - Use of Weak Hash

: 보안성이 낮은 해시 알고리즘을 사용하는 취약점을 의미한다. 약한 해시 알고리즘(예: MD5, SHA-1)은 충돌 공격에 취약하여, 공격자가 해시 값을 쉽게 위조하거나 예측할 수 있다.

'import hashlib

취약한 해시 사용: MD5
def hash_password(password):
return     hashlib.md5(password.encode()).hexdigest()

user_password = "my_secure_password"
hashed_password =     hash_password(user_password)
print("Hashed password:", hashed_password)'

CWE 523 - Unprotected Transport of Credentials

: 사용자 자격 증명이 안전하지 않은 방법으로 전송될 때 발생하는 취약점. 예를 들어, 암호화되지 않은 HTTP를 통해 비밀번호나 API 키를 전송하는 경우, 공격자가 네트워크 트래픽을 가로채어 민감한 정보를 탈취할 수 있다.

import requests

자격 증명을 암호화 없이 전송
' url = "http://example.com/api/login"
credentials = {"username": "user", "password":        "pass"}
response = requests.post(url, data=credentials)

print("Response:", response.text)'

->https를 사용해서 자격 증명을 보호하는 것이 좋은 코드

0개의 댓글