메뉴 건너뛰기

app

코드 속에 숨겨진 폭탄: CWE-259 하드코드된 중요 정보

suritam92026.01.17 21:55조회 수 7댓글 0

    • 글자 크기

1. 하드코드된 중요 정보의 위험성

CWE-259는 데이터베이스 비밀번호, API 키, 암호화 키 등 민감한 인증 정보를 소스 코드 내에 문자열 상수로 직접 기록할 때 발생합니다. 코드는 컴파일되어 배포되더라도 역컴파일(Decompilation)을 통해 쉽게 원래의 문자열을 추출할 수 있습니다. 또한, 소스 코드 관리 시스템(Git 등)에 그대로 노출되어 해당 코드를 공유하는 모든 개발자나 협력사, 혹은 유출 사고 시 공격자에게 시스템의 모든 권한을 그대로 넘겨주는 결과를 초래합니다.

2. 흔히 발생하는 취약한 패턴

개발 단계에서 테스트 편의를 위해 임시로 넣은 정보가 운영 환경까지 방치되는 경우가 많습니다.

DB 접속 정보: String dbPassword = "root1234!";와 같이 소스 코드나 설정 파일에 평문으로 기록.

암호화 키: 데이터를 암호화하기 위한 SecretKey 생성 시 키 값을 코드 내에 상수로 정의.

관리자 계정: 시스템 관리를 위해 소스 코드 내부에 "백도어"처럼 심어놓은 고정된 아이디와 비밀번호.

3. 실무적 대응: 설정 외부화와 암호화 관리

중요 정보는 코드와 철저히 분리하여 관리해야 합니다.

환경 변수 및 설정 파일 활용: OS의 환경 변수나 별도의 프로퍼티 파일(.properties, .yml)을 사용하되, 해당 파일은 형상 관리 대상(Git)에서 제외(gitignore)합니다.

중요 정보 암호화: 설정 파일에 저장하더라도 Jasypt와 같은 라이브러리를 통해 암호화하여 저장합니다.

Vault 서비스 이용: 대규모 시스템의 경우 HashiCorp Vault, AWS Secrets Manager 등 전용 비밀 관리 솔루션을 사용하여 실시간으로 인증 정보를 주입받습니다.

4. CWE-259 대응 및 안전한 설정 관리 자바 코드 예시

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
 
public class DatabaseConfig {
    private static final Logger logger = LoggerFactory.getLogger(DatabaseConfig.class);
 
    // [CWE-259 조치] 소스 코드 내 하드코딩을 제거하고 외부 설정값을 읽어옴
    public Connection getConnection() {
        // [위험 예시] String password = "mysecretpassword"; 
        
        // 1. 시스템 환경 변수 또는 JVM 옵션에서 읽어오기
        String dbUrl = System.getenv("DB_URL");
        String dbUser = System.getenv("DB_USER");
        String dbPassword = System.getenv("DB_PASSWORD"); 
 
        try {
            if (dbPassword == null || dbPassword.isEmpty()) {
                throw new Exception("Database credentials are not set in environment variables.");
            }
 
            logger.debug("Attempting to connect to database: {}", dbUrl);
            return DriverManager.getConnection(dbUrl, dbUser, dbPassword);
 
        } catch (Exception e) {
            // [CWE-754, CWE-390] 예외 처리
            logger.debug("Database connection error: Critical credentials missing or invalid.");
            return null;
        }
    }
}

코멘트: "코드는 공유될 수 있지만, 비밀은 공유되어서는 안 됩니다." 하드코딩된 비밀번호는 시스템의 모든 방어막을 무력화하는 가장 치명적인 약점입니다. 소스 코드를 Git에 올리기 전, 민감한 문자열이 포함되어 있지 않은지 다시 한번 점검하는 습관을 들이십시오. logger.debug()를 통해 연결 상태는 확인하되, 그 속에 담긴 '비밀'은 코드 밖 안전한 곳에 숨겨두는 것이 시큐어 코딩의 철칙입니다.

 
    • 글자 크기
너무 짧은 열쇠의 위험: CWE-326 충분하지 않은 키 길이 사용 (by suritam9) 평문으로 방치된 데이터의 위협: CWE-312 중요 정보 미암호화 저장 (by suritam9)

댓글 달기

첨부 (0)
위로