설명
비밀번호, 토큰, API 키 같은 인증 비밀을 보호하지 않고 평문으로 파일이나 직렬화 저장소에 저장하면 저장소 접근 권한을 얻은 공격자가 해당 값을 그대로 읽을 수 있습니다.
잠재적 영향
- 계정 탈취, 세션 탈취, API 키 오남용으로 이어질 수 있습니다.
- 로그, 백업, 임시 파일에 민감 값이 장기간 남을 수 있습니다.
- 침해 사고 시 유출 범위가 애플리케이션 저장소 밖으로 확대될 수 있습니다.
해결 방법
- 파일에는 민감 정보 자체가 아니라 불투명한 참조값만 저장합니다.
- 저장이 반드시 필요하면 검증된 암호화 라이브러리로 암호화하고 키 관리를 분리합니다.
- 비밀번호는 저장하지 말고 Argon2id, bcrypt, PBKDF2 같은 비밀번호 해시로 처리합니다.
- 로그, JSON/YAML 설정 파일, 임시 파일에도 민감 값을 평문으로 남기지 않습니다.
예시
변경 전
python
from pathlib import Path
from flask import request
def bad_password_file():
password = request.args.get("password")
Path("/var/app/password.txt").write_text(password)
변경 후
python
from argon2 import PasswordHasher
def safe_password_hash(password):
return PasswordHasher().hash(password)
설명:
- 변경 전: 사용자 비밀번호를 평문 파일에 기록합니다.
- 변경 후: 비밀번호 전용 해시로 처리하고 원문을 영속화하지 않습니다.