Chapter01/Sping boot

[ 보안 취약점 ] 적절하지 않은 난수 값 사용 Math.random()

EmmaDev_v 2024. 12. 27. 14:33

 
 

첨부파일 업로드 / 다운로드 기능이있느데
거기서 파일명 정할때 어쩌구 저쩌구 하면서 랜덤값을 생성해야하는 부분이 있음
그 때 쓰이는 코드! 
 

public class GenerateRandomString {
    public static String generateString() {
        String AlphaNumericString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                + "0123456789"
                + "abcdefghijklmnopqrstuvxyz";
        StringBuilder sb = new StringBuilder(10);

        for (int i = 0; i < 10; i++) {
            int index
                    = (int)(AlphaNumericString.length()
                    * Math.random());
            sb.append(AlphaNumericString
                    .charAt(index));
        }
        return sb.toString();
    }
}

 
위 코드에서 이런 취약점 분석 진단을 받았다.
 
 
– 부적절한 난수 생성 체커는 예측 가능한 난수를 사용하는 코드를 검출.
 
– 사용을 금지할 난수 생성 메소드를 옵션으로 지정할 수 있습니다.
 
– 예측 불가능한 숫자가 필요한 상황에서 예측 가능한 난수를 사용한다면,
공격자는 SW에서 생성되는 다음 숫자를 예상하여 시스템을 공격하는 것이 가능하게 됩니다.
 
– 옵션으로 지정된 금지 메소드보다 안전한 방식을 사용하여 난수를 생성합니다
 
 
 
코드 중 *Math.random() 부분을 수정해야함
 
 

import java.security.SecureRandom;

public class GenerateRandomString {
    public static String generateString() {
        String AlphaNumericString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                + "0123456789"
                + "abcdefghijklmnopqrstuvxyz";
        
        SecureRandom random = new SecureRandom();
        StringBuilder sb = new StringBuilder(10);
        
        for (int i = 0; i < 10; i++) {
            int index = random.nextInt(AlphaNumericString.length());
            sb.append(AlphaNumericString.charAt(index));
        }

        return sb.toString();
    }
}

 
 
Math.random()대신 SecureRandom 클래스를 사용해 난수를 생성하는 것으로 변경.
 
 
이유는 Math.random()는 내부적 알고리즘을 사용해 시드값이 노출될 우려, 예측 가능한 우려가 있다고한다.
SecureRandom은 시드가 외부에서 추론되기때문에 보안 측면에서 더 권장된다고함 
 

반응형