본문 바로가기

Math.random 보안 취약 사항 (적절하지 않은 난수값 사용) CWE-330, CWE-338

by 아카이sun 2024. 3. 7.

JavaScript에서 Maht.random값을 사용하니 CWE-330, CWE-338에 대한 보안취약점이 있다는 것을 알게 되었다.

 

GPT는 해당 코드에 대해 다음과같이 설명하고 있다.

CWE-330은 "Small Cryptographic Nonce"라고 알려진 보안 취약점입니다. 이 취약점은 암호학적으로 무작위로 생성되는 nonce(한 번만 사용되는 임의의 숫자)의 크기가 작아서 예측 가능하거나 재사용될 수 있는 경우 발생합니다. nonce는 주로 보안 프로토콜이나 키 생성 등에서 사용되며, 예측 가능하거나 재사용될 경우 보안성이 크게 저하될 수 있습니다.





CWE-338은 "Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG)"라고 알려진 보안 취약점입니다. 이 취약점은 보안 관련 작업에서 약한 암호학적 난수 생성기를 사용할 때 발생합니다


 

즉, 해당 함수는 공격자가 SW에서 생성되는 다음 숫자를 예상하여 시스템을 공격할 수 있다라는 것이다.

따라서 예측하기 어려운 숫자를 생성해야 하는데 다음과 같은 방법으로 대체 가능하다.

let uint32Array = new Uint32Array(1);
// Web Crypto API를 사용하여 암호학적 PRNG로 임의의 숫자를 생성
window.crypto.getRandomValues(uint32Array);
const randomNumber = uint32Array[0] / (Math.pow(2, 32));
print(randomNumber);

unit32Array의 첫번째 값을 사용하면 정수가 반환되므로 

Math.random의 결과값과 유사한 값을 받기 위해서는 Math.pow를 사용하여 출력하면 된다.

댓글