CVE-2021-41117
안전하지 않은 난수 생성
- 게시됨
- 2021. 10. 11.
- 업데이트됨
- 2024. 8. 4.
- CNA 할당 중
- GitHub_M
- 증거 관찰됨
- 2026. 8. 8.
기본 CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N낮음 · 다음 30일
- 백분위수
- 87.1%
- 모델 날짜
- 2026. 9. 21.
EPSS는 통계적 추정치이지 확실성이나 영향의 척도가 아닙니다. 이를 CVSS, KEV 상태, 노출 및 환경과 결합하세요.
요약
keypair는 javascript로 작성된 RSA PEM 키 생성기입니다. keypair는 가능한 한 다른 라이브러리에서 빌려오거나 자체적으로 많은 암호화 기본 요소를 구현하며, 여기에는 node-forge도 포함됩니다. 이 라이브러리가 SSH에 사용되는 동일한 RSA 키를 생성하는 문제가 발견되었습니다. 이는 라이브러리가 동일한 P, Q(따라서 N) 값을 생성한다는 것을 의미하며, 실제로 RSA-2048 키에서는 불가능한 일입니다. 동일한 값이 반복적으로 생성되는 것은 일반적으로 난수 생성이 취약하거나 CSPRNG 출력 처리에 문제가 있음을 나타냅니다. 문제 1: 취약한 난수 생성 (`GHSL-2021-1012`). 이 라이브러리는 전적으로 플랫폼에서 제공하는 CSPRNG에 의존하지 않고, 자체적인 카운터 기반 CMAC 방식을 사용합니다. 문제가 발생하는 지점은 `defaultSeedFile` 함수에서 CMAC 구현을 "진정한" 난수 데이터로 시딩하는 부분입니다. AES-CMAC 생성기를 시딩하기 위해 라이브러리는 JavaScript 실행 환경에 따라 두 가지 다른 방식을 사용합니다. 브라우저에서는 [`window.crypto.getRandomValues()`](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L971)를 사용합니다. 그러나 nodeJS 실행 환경에서는 `window` 객체가 정의되어 있지 않으므로 훨씬 덜 안전한 솔루션을 사용하게 되며, 여기에는 버그도 있습니다. 라이브러리가 가능하면 node의 CSPRNG를 사용하려고 하는 것처럼 보이지만, 안타깝게도 `crypto` 객체가 같은 이름의 변수로 선언되고 `null`로 설정되어 있기 때문에 null입니다. 따라서 node CSPRNG 경로는 결코 실행되지 않습니다. 그러나 `window.crypto.getRandomValues()`를 사용할 수 없을 때는 Lehmer LCG 난수 생성기가 CMAC 카운터를 시딩하는 데 사용되며, LCG는 `Math.random`으로 시딩됩니다. 이는 취약하며 그 자체로 보안 버그에 해당할 가능성이 높지만, 중복 키가 발생하는 극단적인 빈도를 설명하지는 못합니다. 주요 결함: Lehmer LCG의 출력이 잘못 인코딩됩니다. 결함이 있는 특정 [행][https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L1008]은 다음과 같습니다: `b.putByte(String.fromCharCode(next & 0xFF))` `putByte`의 [정의](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L350-L352)는 `util.ByteBuffer.prototype.putByte = function(b) {this.data += String.fromCharCode(b);};`입니다. 단순화하면 `String.fromCharCode(String.fromCharCode(next & 0xFF))`입니다. 이중 `String.fromCharCode`는 거의 확실히 의도하지 않은 것이며 약한 시딩의 원인입니다. 안타깝게도 이로 인해 오류가 발생하지는 않습니다. 오히려 버퍼의 대부분이 0을 포함하게 됩니다. 0xFF로 마스킹하고 있으므로 LCG 출력의 97%가 0으로 변환된다는 것을 알 수 있습니다. 의미 있는 값으로 결과되는 유일한 출력은 48부터 57까지(포함)입니다. 영향은 잘못된 변환으로 인해 RNG 시드의 각 바이트가 97% 확률로 0이 된다는 것입니다. 0이 아닌 경우 바이트는 0부터 9까지입니다. 요약하면 세 가지 즉각적인 우려 사항이 있습니다: 1. 이 라이브러리에는 안전하지 않은 난수 폴백 경로가 있습니다. 이상적으로는 LCG와 `Math.random`을 사용하려고 시도하는 대신 강력한 CSPRNG를 요구해야 합니다. 2. 이 라이브러리는 강력한 CSPRNG를 사용할 수 있음에도 불구하고 NodeJS에서 실행될 때 강력한 난수 생성기를 올바르게 사용하지 않습니다. 3. 폴백 경로에는 시드 데이터의 대부분이 사실상 0이 되는 구현 문제가 있습니다. 취약한 난수 생성으로 인해 keypair는 비교적 추측하기 쉬운 RSA 키를 생성합니다. 이로 인해 공격자가 기밀 메시지를 해독하거나 피해자의 계정에 대한 권한 있는 액세스를 얻을 수 있습니다.
소스
1책임 있는 사용
귀하가 소유하고 있거나 테스트할 권한이 있는 시스템에 대해서만 취약점 정보를 사용하십시오. Kitploit은 공개 연구 메타데이터에 연결되며 익스플로잇 코드나 악성 페이로드를 저장하지 않습니다.