메뉴 건너뛰기

app

CWE-330: 예측 가능한 난수값 사용의 위험성

suritam92026.01.17 14:50조회 수 2댓글 0

    • 글자 크기

1. 부적절한 난수값 사용의 위험성

시스템에서 생성하는 난수(Random Number)가 예측 가능하다면 공격자는 이를 이용해 인증 세션을 탈취하거나, 초기화 비밀번호를 추측하고, 보안 토큰을 위조할 수 있습니다. 자바의 기본 Math.random()이나 java.util.Random은 알고리즘의 결정론적 특성 때문에 이전에 생성된 값을 바탕으로 다음에 올 값을 예측하기가 상대적으로 쉽습니다. 이를 보안 결정(Security Decision)에 사용할 경우 시스템 전체의 신뢰성이 무너질 수 있습니다.

2. 보안 요구사항에 따른 유연한 대응 전략

모든 난수 생성에 엄격한 보안 기준을 적용할 필요는 없습니다. 상황의 중요도에 따라 다음과 같이 유연하게 대응할 수 있습니다.

  • 엄격한 보안(Strict): 세션 ID, 비밀번호 초기화 토큰, 암호화 키 생성 시에는 반드시 예측이 불가능한 암호학적으로 강한 난수 생성기(java.security.SecureRandom)를 사용해야 합니다.

  • 일반 기능(Flexible): 단순히 중복을 피하기 위한 파일명 생성이나 일시적인 UI 효과 등에 사용하는 난수는 보안 결정을 수반하지 않으므로, 기존의 Random 클래스를 사용해도 무방합니다. 다만, 시큐어 코딩 기준을 일관성 있게 유지하고 싶다면 가급적 SecureRandom으로 통일하는 것이 권장됩니다.

3. 실무적 대응: 용도에 맞는 클래스 선택

보안 진단 시 지적을 피하고 시스템의 정밀도를 높이려면 용도별 클래스 사용을 명확히 구분해야 합니다. 파일명의 경우 중복 방지가 목적이라면 난수보다는 UUIDTimestamp를 조합하는 방식이 실무적으로 더 유연하고 효과적입니다.

4. CWE-330 대응 및 상황별 난수 생성 자바 코드 예시

import java.security.SecureRandom;

import java.util.UUID;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

public class RandomGenerator {

    private static final Logger logger = LoggerFactory.getLogger(RandomGenerator.class);

 

    // 1. 보안이 중요한 토큰 생성 (Strict)

    public String generateSecurityToken() {

        SecureRandom secureRandom = new SecureRandom();

        byte[] values = new byte[20];

        secureRandom.nextBytes(values);

        

        logger.debug("Cryptographically secure token generated.");

        return java.util.Base64.getEncoder().encodeToString(values);

    }

 

    // 2. 일반적인 파일명 생성 (Flexible)

    public String generateFileName(String originalName) {

        // 보안 결정에 사용되지 않는 단순 기능이므로 유연하게 대응

        // 난수보다 중복 방지에 최적화된 UUID 활용 권장

        String uniqueID = UUID.randomUUID().toString();

        String fileName = uniqueID + "_" + originalName;

        

        logger.debug("Flexible file name generated: {}", fileName);

        return fileName;

    }

 

    public void processTask() {

        try {

            String token = generateSecurityToken();

            String file = generateFileName("report.pdf");

            

            // 후속 로직 처리...

        } catch (Exception e) {

            // [CWE-754, CWE-390] 예외 발생 시 로그 기록 및 대응

            logger.debug("Error during random generation process: {}", e.getMessage());

        }

    }

}

 

코멘트: CWE-330 조치의 핵심은 용도를 구분하는 것입니다. 세션 관리나 인증처럼 보안의 성패가 갈리는 곳에는 암호학적 난수(SecureRandom)를 사용해 추측 공격을 원천 차단하십시오. 반면, 파일명 생성과 같이 단순 중복 회피가 목적인 기능에서는 UUID 등을 활용하여 개발의 유연성을 확보할 수 있습니다. 이러한 구분은 시스템의 성능과 보안성 사이의 균형을 맞추는 영리한 시큐어 코딩 전략이 됩니다.

    • 글자 크기
CWE-676, 242, 246, 382 위험한 함수 호출: 취약한 API 사용 방지 전략 (by suritam9) CWE-390: 시스템의 눈을 멀게 하는 오류 상황 대응 부재 (by suritam9)

댓글 달기

첨부 (0)
위로