크립트겐랜덤

CryptGenRandom

CryptGenRandom마이크로소프트 CryptoAPI에 포함된 암호화된 보안 유사랜덤 번호 생성기 기능이다.Win32 프로그램에서 마이크로소프트는 임의의 숫자 생성이 필요한 곳이라면 어디든 사용할 것을 권장한다.히브리 대학의 2007년 논문은 CryptGenRandom의 Windows 2000 구현에서 보안 문제를 제안했다(공격자가 기계를 제어할 수 있다고 가정함).마이크로소프트는 나중에 같은 문제가 윈도우 XP에도 존재하지만 비스타에도 존재하지 않는다는 것을 인정했다.마이크로소프트는 2008년 중반에 윈도 XP 서비스 팩 3과 함께 버그 수정안을 발표했다.[2]

배경

Win32 API에는 (SHANNEL API를 통한) 네이티브 TLS 지원, 코드 서명 등 암호 보안에 대한 종합적인 지원이 포함되어 있다.이러한 기능은 RSAAES 키 생성과 같은 암호화 작업을 위한 네이티브 윈도우즈 라이브러리에 구축되어 있다.이러한 라이브러리는 암호화된 보안 유사망 번호 생성기(CSPRNG)에 의존한다.CryptGenRandom은 Win32 프로그래밍 환경의 표준 CSPRNG이다.

운영방법

마이크로소프트가 제공하는 암호화 제공자들은 현재 RtlGenRandom이라는 내부 기능에 기초하고 있는 CryptGenRandom의 동일한 구현을 공유한다.[3]2007년 현재 알고리즘의 일반적인 개요만 발표되었다.

[RtlGenRandom]은 FIPS 186-2 부록 3.1에 지정한 대로 SHA-1을 G 기능으로 생성한다.그리고 엔트로피(Entropy:

  • 현재 프로세스 ID(GetCurrentProcess)ID).
  • 현재 스레드 ID(GetCurrent)스레드ID).
  • 부팅 시간 이후의 틱 수(GetTickCount)
  • 현재 시간(GetLocalTime).
  • 다양한 고정밀 성능 카운터(QueryPerformanceCounter)
  • 사용자 환경 블록의 MD4 해시(사용자 이름, 컴퓨터 이름 및 검색 경로 포함). [...]
  • RDTSC, RDMSR, RDPMC와 같은 고정밀 내부 CPU 카운터

[118: 낮은 수준의 시스템 정보 필드 성능 카운터의 긴 목록]

보안

암호 시스템의 CSPRNG의 보안은 그것이 동적 키 물질의 기원이기 때문에 중요하다.은행 웹사이트와의 HTTPS 세션을 보호하는 AES TLS 세션 키와 같이 "즉시"가 필요한 키는 CSPRNG에서 유래한다.이 유사성 수치가 예측 가능하다면 세션 키도 예측 가능하다.CryptGenRandom은 Win32 환경에서 사실상의 표준 CSPRNG이기 때문에 윈도 사용자에게는 보안이 매우 중요하다.

CryptGenRandom 알고리즘의 구체적인 내용은 공식적으로 발표되지 않았다.공개되지 않은 임의 번호 생성 알고리즘과 마찬가지로, 오래된 알고리즘의 사용을 포함한 이론적 약점과 시스템에 대한 로컬 액세스를 가진 공격자가 어느 정도 추정하거나 제어할 수 있는 단조롭게 증가하는 여러 카운터에서 엔트로피 수집에 대한 의존성에 취약할 수 있다.

암호해석

2007년 11월 레오 도렌도르프 등이 히브리 예루살렘 대학하이파 대학 등에서 발표한 CryptGenRandom의 암호 분석 결과, 알고리즘의 윈도 2000 구현에서 유의미한 약점이 발견되었다.[5]

이 취약성을 이용하려면 공격자는 먼저 난수 생성기를 실행하는 프로그램을 손상시켜야 한다.논문의 약점은 모두 공격자가 발전기에서 상태 비트를 빼돌리는 것에 달려 있다.이 공격을 수행할 수 있는 위치에 있는 공격자는 일반적으로 임의의 숫자 생성기를 물리칠 수 있는 위치에 있을 것이다(예를 들어, 그들은 단순히 발생기의 출력을 냄새를 맡거나 메모리에 고정하여 알려진 값을 얻을 수 있다).그러나 히브리 대학 팀은 공격자가 CryptGenRandom 인스턴스의 보안을 끈질기게 위반하기 위해 상태 비트를 한 번만 훔치면 된다는 점에 주목한다.그들은 또한 그들이 수집한 정보를 이용하여 생성된 과거의 무작위 번호를 결정할 수 있으며, 신용카드 번호와 같이 이미 전송된 정보를 손상시킬 수 있다.

논문의 공격은 크립트겐랜덤이 스트림 암호 RC4를 사용한다는 사실에 근거한 것으로, 상태가 알려지면 역주행할 수 있다.그들은 또한 CryptGenRandom이 사용자 모드에서 실행되어, 예를 들어 버퍼 오버플로를 이용함으로써 사용자 수준에서 운영 체제에 대한 액세스 권한을 얻는 모든 사람이 해당 프로세스에 대한 CryptGenRandom의 상태 정보를 얻을 수 있도록 한다는 점을 활용한다.마지막으로 CryptGenRandom은 엔트로피에서 씨앗을 간헐적으로 새로 고친다.이 문제는 각각의 Win32 프로세스가 CryptGenRandom 상태라는 고유한 인스턴스를 가지고 있다는 사실 때문에 악화된다. 그러나 이것은 한 프로세스의 타협이 다른 모든 과정을 초월적으로 손상시키지 않는다는 것을 의미하지만, 그것은 또한 성공적인 휴식 시간의 수명을 증가시킬 수도 있다.

CryptGenRandom 알고리즘의 세부 정보가 공개되지 않기 때문에, Dorrendorf 팀은 역 엔지니어링 도구를 사용하여 알고리즘의 작동 방식을 식별했다.이들의 논문은 윈도 암호 난수 생성기의 작동[citation needed] 방식에 대해 최초로 공개된 기록이다.

공통 기준

Windows 2000, XP 및 2003은 모두 CryptGenRandom() 및 FIPSGenRandom() 구현을 포함하여 EAL4+ 평가를 성공적으로 거쳤다.Security Target 문서는 Common Criteria Portal에서 제공되며, EAL4 요건 준수를 나타낸다.결과적으로 알고리즘의 보안에 대해 결론을 도출할 수 있는 것은 거의 없다. EAL4는 베스트 프랙티스와 명시된 보안 목표에 대해 제품을 측정하지만, 심층적인 암호 분석을 거의 수반하지 않는다.

FIPS 인증

마이크로소프트는 다음과 같은 환경에서 RNG 구현에 대한 검증을 획득했다.

  • Windows Vista RNG 구현(인증서 321)[6]
  • Windows 2003 향상된 암호화 공급자(rsaenh.dll)(인증서 316)[6]
  • Windows 2003 DSS 및 Diffie-Hellman 암호화 공급자(dssenh.dll)(인증서 314)[6]
  • Windows 2003 커널 모드 암호화 모듈(fips.sys)(인증서 313)[6]
  • Windows CE 및 Windows Mobile Enhanced Cryptography Provider(rsaenh.dll)(인증서 292)[6]
  • Windows CE 및 Windows Mobile Enhanced Cryptography Provider(rsaenh.dll)(인증서 286)[6]
  • Windows CE 고급 암호화 공급자(rsaenh.dll)(인증서 66)[6]

이러한 테스트는 "제품의 보안에 대한 척도를 제공하기보다는 다양한 승인된 RNG 규격에 적합성을 시험하기 위해 설계된다. [...] 따라서 검증은 전체적인 제품 보안에 대한 평가나 보증으로 해석되어서는 안 된다."결과적으로 알고리즘의 보안에 대해 결론을 도출할 수 있는 것은 거의 없다. FIPS 평가는 반드시 소스 코드를 검사하거나 RNG 씨앗이 생성되는 방법을 평가하지는 않는다.[7]

대안

API 수준

Windows 개발자들은 CryptGenRandom 기능에 접근할 수 있는 몇 가지 대체 수단을 가지고 있다. 이러한 대안들은 동일한 알고리즘을 호출하고 동일한 보안 특성을 공유하지만 다른 장점이 있을 수 있다.

RtlGenRandom 사용

그는 "역사적으로 우리는 개발자들에게 키, 노이스, 패스워드를 생성하기 위해 랜드와 같은 기능을 사용하지 말고 암호화된 보안 난수를 생성하는 크립트겐랜덤과 같은 기능을 사용해야 한다고 항상 말했다.CryptGenRandom의 문제는 당신이 CryptAcquireContext 등 CryptoAPI를 끌어와야 한다는 것인데, 당신이 다른 암호화 기능을 사용하고 있다면 괜찮다.

기본 Windows XP 이상 설치 시 CryptGenRandom은 ADVAPI32라는 함수를 호출한다!모든 Crypt를 로드할 필요가 없는 RtlGenRandomAPI 같은 거.실제로 새로운 휘드비 CRT 기능인 란드_s는 RtlGenRandom"을 부른다.[8]

RNGCryptoServiceProvider 사용

를 사용하는 프로그래머.NETRNGCryptoServiceProvider 클래스를 사용해야 한다.[9]

Cryptography API 사용: 차세대(CNG)

CNG는 더 이상 사용되지 않는 Crypto API를 장기간 대체하는 것이다.키 생성을 위한 전용 기능뿐만 아니라 동등한 기능 BCryptGenRandom[11] 제공한다.

프로그래밍 언어

  • Microsoft C++ 라이브러리 함수 rand_s는 RtlGenRandom을 사용하며 Microsoft는 안전한 애플리케이션을 위해 권장한다.[12]
  • 유닉스 유사 시스템에서 /dev/urandom을 사용하는 os 모듈의 Python 함수 urandom은 윈도우즈 시스템에서 CryptGenRandom을 호출한다.[13]
  • Windows에서 JRE의 OpenJDK 및 Oracle 배포에 사용할 수 있는 Java JCA 공급자 "SunMSCAPI"는 Windows-PRNG라는 알고리즘 이름으로 SecureRandom 구현을 제공한다. 이 클래스는 임의 또는 시드 바이트에 대한 모든 쿼리와 기본 CryptGenRandom에 추가 시드 바이트를 설정하는 기능을 제공한다.[14]

참고 항목

참조

  1. ^ CryptGenRandom 함수(Windows)
  2. ^ "Microsoft confirms that XP contains random number generator bug". Archived from the original on 2008-06-22.
  3. ^ RtlGenRandom 함수(Windows)
  4. ^ Writing Secure Code, Second Edition. ISBN 0-7356-1722-8.
  5. ^ Dorrendorf, Leo; Zvi Gutterman; Benny Pinkas. "Cryptanalysis of the Random Number Generator of the Windows Operating System" (PDF). Archived from the original (pdf) on 2012-09-06. Retrieved 2007-11-12.
  6. ^ a b c d e f g "RNG Validation List". NIST Computer Security Division. Retrieved 18 June 2013.
  7. ^ "The Random Number Generator Validation System (RNGVS)" (PDF). National Institute of Standards and Technology Computer Security Division. 31 January 2005. Archived from the original (PDF) on 24 February 2013. Retrieved 18 June 2013.
  8. ^ Michael Howard의 웹 로그 : CryptoA를 사용하지 않고 Windows에서 암호화된 보안 임의 번호PI
  9. ^ "Archived copy". Archived from the original on 2006-09-08. Retrieved 2007-08-27.{{cite web}}: CS1 maint: 타이틀로 보관된 사본(링크)
  10. ^ Crypto API 차세대(Windows)
  11. ^ BCryptGenRandom(Windows)
  12. ^ http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx Visual C++ 개발자 센터 , rand_s
  13. ^ https://docs.python.org/2/library/os.html#os.urandom Python Library Reference
  14. ^ http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunMSCAPI Oracle Java SE 8 기술 문서, Sun 공급자

외부 링크