마시멜로 암호화는 기술적으로 어떻게 작동합니까?


14

푸시 업데이트를 통해 Nexus 5에 Marshmallow를 설치했습니다. 암호화 작동 방식이 혼란 스러워요. 컴퓨터 암호화에 대한 기술 지식이 풍부합니다. Android 6에 대한 비슷한 지식을 얻고 싶습니다.

다음은 내가 한 일과 어떻게 혼란스러워했는지입니다. 공장 초기화 후 PIN을 설정하고 장치를 암호화했습니다. 부팅 할 때 PIN이 나에게 물었습니다. 그런 다음 PIN을 제거하고 장치를 다시 시작했습니다. 부팅시 PIN을 요청하지 않았지만 장치는 여전히 설정 메뉴에서 암호화 된 것으로보고했습니다. 후자는 PIN이 암호 해독 키를 잠금 해제 할 것으로 예상했기 때문에 혼란 스럽습니다.

질문 :

  • PIN이없는 암호화의 경우 암호 해독 키는 어디서 제공됩니까? TPM과 유사한 칩에 저장되어 있다고 가정합니다. 맞습니까? 그렇다면 해커가 칩에서이 키를 요청하지 못하게하는 이유는 무엇입니까? 펌웨어의 해시를 확인합니까? 다른 거있어? 기술적 인 세부 사항은 대단히 감사하겠습니다.
  • PIN으로 암호화하는 경우 PIN이 암호 해독 키에 액세스하기위한 추가 토큰으로 사용됩니까? 또는 PIN이없는 것처럼 암호 해독 프로세스가 정확하게 작동합니까?

TL; DL 답변 :

암호 해독 키는 다음과 같이 모두 잠금 해제됩니다.

  • PIN (또는 비밀번호 등) 또는 기본 비밀번호가없는 경우 기본 비밀번호
  • TEE (추출 할 수없는 키를 사용하는 하드웨어 지원 서명 생성기)
  • 소금 (이용 가능하지만 레인보우 테이블 공격 방지)

감사. 롤리팝에도 적용되지만 이것이 내가 아는 한 정답입니다. L에 암호가없는 암호화를 설정하거나 암호화 후 PIN을 제거 할 수 없다는 것을 기억하지 못하기 때문에 M과 L의 차이점이 있다고 생각했습니다.
marcv81

답변:


15

여기 Android 매뉴얼에서 인용하고 있지만 다음과 같습니다.

노트:

내가 사용한 출처는 마시멜로와 직접 관련이 없지만 롤리팝 이상과 관련이 있습니다.

TL : DR

방금 OP의 질문을 해결하겠습니다. 기술적 세부 사항은 다음과 같습니다.

  1. 기본 암호화 키는 하드웨어 소스 (TPM과 유사한 칩)와 소스 파일 default_password에서 정의 된 AOSP의 기본 비밀번호 에서 제공 cryptfs.c됩니다 (아래 참조).

  2. 예. 기본값뿐만 아니라 모든 암호는 키로 만들어지며 TEE라고하는 TPM과 유사한 칩에 저장됩니다 ( "신뢰 된 실행 환경"의 약어, 자세한 내용은 아래 참조).

  3. 장치 SoC의 칩에 UART / JTAG 액세스 권한이있는 해커가 기술적으로 TEE 키에 액세스하거나 사용자 지정 커널이이 정보를 해커에게 유출 할 수 있습니다. 음모 이론의 일부 3 글자 대행사는 OEM과 협력하여 생산 장치에 사용되는 이러한 안전하지 않은 커널을 얻을 수 있지만 많은 상점을 세우지는 않을 것입니다. 자세한 내용은이 답변의 마지막 섹션을 참조하십시오.

해커가 키에 액세스하는 것을 막는 유일한 방법은 해커가 수행해야하는 엄청난 노력입니다.

  1. 펌웨어의 해시 (체크섬) 확인 ( Google에서 "인증 된 부팅" 이라고 함 )은 실제로 기본적으로 Lollipop 이상 (및 JellyBean 4.3부터 사용 가능)에서 커널 모듈에 의해 수행됩니다 dm-verity. 그러나 이것은 암호화 상태와 무관합니다.

출처 : AOSP 보안 안내서 here .

  1. 사용자 정의 비밀번호로 시스템을 해독하는 과정에 대해서는 아래를 참조하십시오. 여기서는 사용자 암호가 암호화 키 생성 및 사용과 관련되어 있음을 알려드립니다.

개요

처음 부팅 할 때 장치는 임의로 생성 된 128 비트 마스터 키를 만든 다음 기본 암호와 저장된 솔트로 해시합니다. 기본 암호는 "default_password"입니다. 그러나 결과 해시도 TEE (TrustZone 등)를 통해 서명되며, 서명 해시를 사용하여 마스터 키를 암호화합니다.

Android 오픈 소스 프로젝트 cryptfs.c 파일에 정의 된 기본 비밀번호를 찾을 수 있습니다 .

사용자가 장치에서 PIN / 패스 또는 비밀번호를 설정하면 128 비트 키만 다시 암호화되어 저장됩니다. (즉, 사용자 PIN / 통과 / 패턴 변경으로 인해 사용자 데이터 파티션을 다시 암호화하지 않습니다.)

기본 암호화로 암호화 된 장치 시작

이것은 암호없이 암호화 된 장치를 부팅 할 때 발생합니다. Android 5.0 기기는 처음 부팅 할 때 암호화되므로 비밀번호가 설정되어 있지 않아야하므로 이것이 기본 암호화 상태입니다.

  1. 비밀번호없이 암호화 된 / 데이터 감지

/ data를 마운트 할 수없고 플래그 중 하나 encryptable또는 forceencrypt설정 되어 Android 디바이스가 암호화되어 있는지 감지하십시오 .

vold설정 vold.decrypttrigger_default_encryption시작되는, defaultcrypto서비스. trigger_default_encryption/ data가 암호를 사용하거나 사용하지 않고 암호화되는지 확인하기 위해 암호화 유형을 확인합니다.

  1. / 데이터 해독

dm-crypt장치를 사용할 수 있도록 블록 장치 위에 장치를 만듭니다 .

  1. 마운트 / 데이터

vold그런 다음 해독 된 실제 / 데이터 파티션을 마운트 한 다음 새 파티션을 준비합니다. 속성 vold.post_fs_data_done0로 설정 한 다음로 설정 vold.decrypt합니다 trigger_post_fs_data. 이 원인 init.rc의 실행 post-fs-data명령을. 필요한 디렉토리 나 링크를 만든 다음로 설정 vold.post_fs_data_done합니다 1.

일단 vold그 속성에 1을보고,이 속성을 설정 vold.decrypt하려면 다음과 같이하십시오 trigger_restart_framework. 이로 인해 init.rc클래스에서 서비스가 main다시 시작되고 부팅 이후 처음으로 late_start 클래스에서 서비스가 시작됩니다.

  1. 프레임 워크 시작

이제 프레임 워크는 해독 된 / 데이터를 사용하여 모든 서비스를 부팅하고 시스템을 사용할 수 있습니다.

기본 암호화없이 암호화 된 장치 시작

암호가 설정된 암호화 된 장치를 부팅 할 때 발생합니다. 장치의 비밀번호는 핀, 패턴 또는 비밀번호 일 수 있습니다.

  1. 비밀번호로 암호화 된 장치 감지

플래그 때문에 안드로이드 장치가 암호화되어 있음을 감지 ro.crypto.state = "encrypted"

vold/ data가 암호로 암호화 vold.decrypt되어 trigger_restart_min_framework있기 때문에로 설정 됩니다 .

  1. tmpfs 마운트

init에서 전달 된 매개 변수와 함께 / data에 제공된 초기 마운트 옵션을 저장하기 위해 5 개의 특성을 설정합니다 init.rc. vold다음 속성을 사용하여 암호화 매핑을 설정합니다.

ro.crypto.fs_type

ro.crypto.fs_real_blkdev

ro.crypto.fs_mnt_point

ro.crypto.fs_options

ro.crypto.fs_flags (ASCII 8 자리 16 진수 앞에 0x)

  1. 비밀번호를 묻는 프레임 워크 시작

프레임 워크가 시작되고 vold.decrypt로 설정되어 trigger_restart_min_framework있습니다. 이것은 프레임 워크가 tmpfs /data디스크에서 부팅되고 있으며 사용자 암호를 가져와야한다는 것을 알려줍니다 .

그러나 먼저 디스크가 올바르게 암호화되었는지 확인해야합니다. 명령 cryptfs cryptocomplete을에 보냅니다 vold. vold암호화가 성공적으로 완료되면 0을, 내부 오류에 -1을, 암호화가 성공적으로 완료되지 않으면 -2를 반환합니다. 플래그 vold의 암호화 메타 데이터를보고이를 판별합니다 CRYPTO_ENCRYPTION_IN_PROGRESS. 설정된 경우 암호화 프로세스가 중단되었으며 장치에 사용 가능한 데이터가 없습니다.

경우 vold반환 오류가, UI를 재부팅하고 사용자에게 메시지를 표시하여 장치를 공장 재설정하고 그렇게 언론에 사용자에게 버튼을 제공합니다.

  1. 비밀번호로 데이터 해독

일단 cryptfs cryptocomplete성공, 프레임 워크 디스플레이는 UI는 디스크 암호를 묻는. UI는에 명령 cryptfs checkpw을 보내서 비밀번호를 확인합니다 vold. 암호가 올 바르면 (암호 해독 /data을 임시 위치 에 성공적으로 마운트 한 후 마운트 해제하면 결정됨 ) vold는 암호 해독 된 블록 장치의 이름을 속성에 저장 ro.crypto.fs_crypto_blkdev하고 상태 0을 UI에 반환합니다. 암호가 틀리면 UI에 -1을 반환합니다.

  1. 프레임 워크 중지

UI는 암호화 부팅 그래픽을 표시 한 다음 명령을 사용하여 vold를 호출합니다 cryptfs restart. vold속성 설정 vold.decrypttrigger_reset_main야기 init.rc할을 class_reset main. main클래스의 모든 서비스가 중지 tmpfs /data되어 마운트를 해제 할 수 있습니다.

  1. 마운트 / 데이터

vold그런 다음 해독 된 실제 /data파티션 을 마운트하고 새 파티션을 준비합니다 (처음 릴리스에서 지원되지 않는 삭제 옵션으로 암호화 된 경우 아직 준비되지 않았을 수 있음). 속성 vold.post_fs_data_done0로 설정 한 다음로 설정 vold.decrypt합니다 trigger_post_fs_data. 이로 인해이 ( init.rc가) 실행 post-fs-data commands됩니다. 필요한 디렉토리 나 링크를 만든 다음로 설정 vold.post_fs_data_done합니다 1. 일단 vold를보고 1해당 속성에, 그것은 속성 설정 vold.decrypt에를 trigger_restart_framework. 이로 인해 init.rc클래스에서 서비스가 main다시 시작 late_start되고 부팅 이후 처음으로 클래스에서 서비스가 시작됩니다 .

  1. 전체 프레임 워크 시작

이제 프레임 워크는 해독 된 / data 파일 시스템을 사용하여 모든 서비스를 부팅하고 시스템을 사용할 수 있습니다.

암호화 된 키 저장

암호화 된 키는 암호화 메타 데이터에 저장됩니다. 하드웨어 백업은 TEE (Trusted Execution Environment) 서명 기능을 사용하여 구현됩니다. 이전 scrypt에는 사용자 비밀번호와 저장된 솔트 에 적용 하여 생성 된 키로 마스터 키를 암호화했습니다 .

오프 박스 공격에 대해 키를 복원력있게 만들기 위해 저장된 TEE 키로 결과 키에 서명하여이 알고리즘을 확장합니다. 그런 다음 결과 시그니처는를 한 번 더 적용하여 적절한 길이의 키로 바뀝니다 scrypt. 그런 다음이 키는 마스터 키를 암호화하고 해독하는 데 사용됩니다. 이 키를 저장하려면

  1. 임의의 16 바이트 디스크 암호화 키 (DEK) 및 16 바이트 솔트를 생성하십시오.
  2. scrypt32 바이트 중간 키 1 (IK1)을 생성하려면 사용자 비밀번호와 솔트에 적용하십시오 .
  3. 하드웨어 바인딩 개인 키 (HBK) 크기에 0 바이트의 IK1을 채 웁니다. 구체적으로 다음과 같이 채 웁니다. 00 || IK1 || 00..00; 하나의 0 바이트, 32 IK1 바이트, 223 0 바이트.
  4. 256 바이트 IK2를 생성하기 위해 HBK로 IK1을 부호로 채워 넣습니다.
  5. 적용 scrypt32 바이트 IK3 생산 IK2 염화칼슘 (2 단계와 같은 염)에 관한 것이다.
  6. IK3의 처음 16 바이트를 KEK로 사용하고 마지막 16 바이트를 IV로 사용하십시오.
  7. 키 KEK 및 초기화 벡터 IV를 사용하여 AES_CBC로 DEK를 암호화하십시오.

Android N은 어떻습니까? 동료들은 이전과 같이 장치의 시작이 보호되지 않아 공격자가 이전보다 쉽게 ​​가질 수 있기 때문에 암호화가 Android 7이라는 약한 가정을했습니다. 이것이 사실이라고 생각하십니까?
David

@David는이 질문의 범위를 벗어납니다 .Android Nougat에 대해 다른 질문을하십시오.
Tamoghna Chowdhury


복구 모드에서 DATA 파티션을 어떻게 해독 할 수 있습니까? init.recovery. <ro.hardware> .rc를 통해
Benny

@Benny 그것에 대해 적절한 질문을 해주세요
Tamoghna Chowdhury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.