Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

채택 가능한 저장소

Android는 항상 SD 카드와 같은 외부 저장소 액세서리를 지원해 왔지만 이러한 액세서리는 보편적으로 단순한 파일 저장소로 제한되었습니다. 이는 기존 외부 저장소에서 기대되는 일시적 특성과 최소의 데이터 보호 기능 때문이었습니다. Android 6.0에는 외부 저장소 미디어를 채택하여 내부 저장소처럼 기능하게 할 수 있는 기능이 도입되었습니다.

외부 저장소 미디어가 채택되면 한 번에 하나의 Android 기기와만 작동이 가능하도록 형식이 지정되고 암호화됩니다. 미디어는 미디어를 채택한 Android 기기에 밀접하게 연결되어 있으므로 모든 사용자의 앱과 비공개 데이터를 모두 안전하게 보관할 수 있습니다.

사용자가 SD 카드와 같은 새 저장소 미디어를 채택 가능한 위치에 삽입하면 Android는 미디어를 어떻게 사용하고 싶은지 물어봅니다. 사용자는 미디어를 채택하여 형식을 지정하고 암호화하도록 하거나 계속 원래대로 단순한 파일 저장소로 사용할 수도 있습니다. 채택하기로 한 경우 플랫폼에서는 기본으로 공유된 저장소 콘텐츠를 새로 채택된 미디어로 마이그레이션하여(보통 /sdcard에서 마운트됨) 내부 저장소의 중요한 공간을 확보할 수 있는 옵션을 제공합니다. MBR의 사용으로 인해 2TB로 제한되는 기존 저장소와 달리 채택 가능한 저장소는 GPT를 사용하므로 파일 공간 한도가 ~9ZB에 달합니다.

앱은 개발자가 android:installLocation 속성을 통해 지원 의향을 나타낸 경우에만 채택된 저장소 미디어에 배치할 수 있습니다. 지원되는 앱이 새로 설치된 경우 앱은 여유 공간이 가장 많은 저장기기에 자동으로 배치되며, 사용자는 설정 앱에서 저장기기 간에 지원되는 앱을 이동할 수 있습니다. 채택된 미디어로 이동된 앱은 미디어가 제거되는 동안 기억되었다가 미디어가 다시 연결되면 돌아옵니다.

보안

플랫폼은 채택된 각 기기의 암호화 키를 무작위로 생성하며, 키는 Android 기기의 내부 저장소에 저장됩니다. 이는 채택된 미디어를 내부 저장소 만큼이나 안전하게 만들어 주는 효과를 합니다. 키는 채택된 파티션 GUID에 따라 채택된 기기에 연결됩니다. 채택된 서비스는 aes-cbc-essiv:sha256 알고리즘 및 128비트 키 크기로 구성된 dm-crypt를 사용하여 암호화됩니다.

채택된 기기의 디스크 레이아웃은 SELinux 라벨 등의 내부 데이터 파티션을 밀접하게 반영합니다. 멀티 사용자가 Android 기기에서 지원되는 경우 채택된 저장기기 역시 내부 저장소와 동일한 격리 수준으로 멀티 사용자를 지원합니다.

채택된 저장기기의 콘텐츠는 저장기기를 채택한 Android 기기에 밀접하게 연결됩니다. 따라서 암호화 키를 상위 기기에서 추출할 수 없어야 하며 결과적으로는 저장기기를 다른 곳에 마운트할 수 없습니다.

콘텐츠 모드의 기본 암호화 알고리즘은 aes-256-xts이며 파일 이름은 aes-256-heh입니다. ro.crypto.volume.contents_modero.crypto.volume.filenames_mode의 값을 각각 변경하거나 device.mk에서 PRODUCT_PROPERTY_OVERRIDES를 설정하여 이를 변경할 수 있습니다.

커널이 HEH 파일 이름 암호화를 지원하지 않는 경우 대신 다음을 device.mk에 추가하여 CTS 모드를 사용할 수 있습니다.

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.volume.filenames_mode=aes-256-cts

성능 및 안정성

실수로 인한 데이터 손실이나 손상을 피할 수 있도록 배터리 칸 안의 슬롯이나 보호 덮개 뒤쪽과 같은 안전한 위치의 외부 저장소 미디어만 채택을 고려해야 합니다. 특히 휴대전화나 태블릿에 연결된 USB 기기는 채택을 고려하면 안 됩니다. 한 가지 일반적인 예외는 TV 형식의 기기에 연결된 외부 USB 드라이브입니다. 이는 TV 전체가 안정적인 위치에 설치되는 경우가 일반적이기 때문입니다.

사용자가 새 저장기기를 채택하면 플랫폼에서 벤치마크를 실행하여 성능을 내부 저장소와 비교합니다. 채택된 기기가 내부 저장소에 비해 많이 느리면 플랫폼은 사용자에게 잠재적인 경험 저하에 대해 경고합니다. 이 벤치마크는 인기 Android 앱의 실제 I/O 동작에서 파생되었습니다. 현재로서는 AOSP 구현에서 단일 기준을 벗어난 사용자에게만 경고를 표시하지만 기기 제조업체에서는 카드가 심하게 느린 경우 채택을 아예 거부하는 등 이를 추가적으로 조정할 수 있습니다.

채택된 기기는 POSIX 권한, 그리고 ext4 또는 f2fs 등의 확장된 속성을 지원하는 파일 시스템을 통해 형식이 지정되어야 합니다. 최적의 성능을 원하는 경우 f2fs 파일 시스템을 플래시 기반 저장기기에 사용하는 것이 좋습니다.

주기적인 유휴 유지관리를 수행하는 경우 플랫폼에서는 내부 저장소처럼 채택된 미디어에도 FI_TRIM을 발행합니다. 최신 SD 카드 사양은 DISCARD 명령을 지원하지 않습니다. 하지만 대신 SD 카드 펌웨어가 최적화 용도로 사용할 수 있는 ERASE 명령으로 커널이 이를 대체합니다.

이중 암호화 해결

Android 8.x 이하에서는 채택 가능한 저장소가 FBE와 함께 작동하지 않았습니다. 채택 가능한 저장소가 있는 기존의 모든 기기는 전체 디스크 암호화(FDE)를 사용했습니다. Android 9에서는 채택 가능한 저장소가 FBE와 함께 작동합니다. 하지만 채택 가능한 저장소에 FDE 및 FBE 레이어가 있으므로 기본적으로 파일 콘텐츠가 이중으로 암호화됩니다. 기본적으로 두 레이어 모드 파일 콘텐츠를 암호화하므로 기기 성능이 느려질 수 있습니다. 이중 암호화 문제를 해결하고 기기 속도를 높이는 방법:

  1. 이 패치를 커널에 추가합니다.
  2. 이 변경사항을 vold에 통신하려면 다음을 device.mk에 추가합니다.
    PRODUCT_PROPERTY_OVERRIDES += ro.crypto.allow_encrypt_override=true

이를 설정했지만 커널 패치가 없는 경우 채택 가능한 저장소가 작동하지 않으며, vold 로그에는 dm 기기를 생성할 수 없었다는 오류가 포함됩니다.

테스트

채택 가능한 저장소가 작동하는지 테스트하려면 이 CTS 테스트를 실행하세요.

cts-tradefed run commandAndExit cts-dev \
        -m CtsAppSecurityHostTestCases \
        -t android.appsecurity.cts.AdoptableHostTest

기기에 내장형 슬롯이 없거나 USB 커넥터가 활성 adb 연결에 사용되고 있는 상황에서 USB 드라이브와 SD 카드의 동작을 확인하려면 다음을 사용하세요.

    adb shell sm set-virtual-disk true