הצפנת מטא נתונים

אנדרואיד 7.0 ואילך תומך בהצפנה מבוססת קבצים (FBE). FBE מאפשר להצפין קבצים שונים באמצעות מפתחות שונים הניתנים לפתיחה עצמאית. מפתחות אלה משמשים להצפנת תוכן קבצים ושמות קבצים. כאשר נעשה שימוש ב-FBE, מידע אחר, כגון פריסות ספריות, גדלי קבצים, הרשאות וזמני יצירה/שינוי, אינו מוצפן. ביחד, מידע נוסף זה ידוע כמטא נתונים של מערכת הקבצים.

אנדרואיד 9 הציגה תמיכה בהצפנת מטא נתונים. עם הצפנת מטא נתונים, מפתח יחיד הקיים בזמן האתחול מצפין כל תוכן שאינו מוצפן על ידי FBE. מפתח זה מוגן על ידי Keymaster, אשר בתורו מוגן על ידי אתחול מאומת.

הצפנת מטא נתונים מופעלת תמיד באחסון שניתן לאמץ בכל פעם ש-FBE מופעל. ניתן להפעיל הצפנת מטא נתונים גם באחסון פנימי. במכשירים שהושקו עם אנדרואיד 11 ומעלה חייבת להיות מופעלת הצפנת מטא נתונים באחסון פנימי.

יישום על אחסון פנימי

ניתן להגדיר הצפנת מטא נתונים באחסון הפנימי של מכשירים חדשים על ידי הגדרת מערכת הקבצים של metadata , שינוי רצף ה-Init והפעלת הצפנת מטא נתונים בקובץ fstab של המכשיר.

דרישות מוקדמות

ניתן להגדיר הצפנת מטא נתונים רק כאשר מחיצת הנתונים מעוצבת לראשונה. כתוצאה מכך, תכונה זו מיועדת רק למכשירים חדשים; זה לא משהו ש-OTA צריך לשנות.

הצפנת מטא-נתונים דורשת שמודול dm-default-key יהיה זמין בקרנל שלך. באנדרואיד 11 ומעלה, dm-default-key נתמך על ידי הגרעינים הנפוצים של אנדרואיד, גרסה 4.14 ומעלה. גרסה זו של dm-default-key משתמשת במסגרת הצפנה בלתי תלויה בחומרה ובספק הנקרא blk-crypto .

כדי להפעיל dm-default-key , השתמש ב:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key משתמש בחומרת הצפנה מוטבעת (חומרה המצפינה/מפענחת נתונים בזמן שהיא בדרך אל/ממכשיר האחסון) כאשר היא זמינה. אם לא תשתמש בחומרת הצפנה מוטבעת, יש צורך גם לאפשר חזרה ל-API ההצפנה של הקרנל:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

כאשר אינך משתמש בחומרת הצפנה מוטבעת, עליך לאפשר גם כל האצה זמינה מבוססת מעבד כפי שהומלץ בתיעוד ה-FBE .

באנדרואיד 10 ומטה, dm-default-key לא נתמך על ידי הקרנל הנפוץ של אנדרואיד. לכן זה היה תלוי בספקים ליישם dm-default-key .

הגדר מערכת קבצים של מטא נתונים

מכיוון שלא ניתן לקרוא שום דבר במחיצת ה-Userdata עד שמפתח ההצפנה של המטא-נתונים קיים, על טבלת המחיצות להפריש מחיצה נפרדת הנקראת "מחיצת המטא-נתונים" לאחסון ה-keymaster blobs המגינים על מפתח זה. מחיצת המטא נתונים צריכה להיות 16MB.

fstab.hardware חייב לכלול ערך עבור מערכת הקבצים של המטא-נתונים שמתגוררת על המחיצה הזו ומעלה אותה ב- /metadata , כולל דגל formattable כדי להבטיח שהוא מעוצב בזמן האתחול. מערכת הקבצים f2fs לא עובדת על מחיצות קטנות יותר; אנו ממליצים להשתמש ב-ext4 במקום זאת. לדוגמה:

/dev/block/bootdevice/by-name/metadata              /metadata          ext4        noatime,nosuid,nodev,discard                          wait,check,formattable

כדי להבטיח שנקודת ההרכבה /metadata קיימת, הוסף את השורה הבאה ל- BoardConfig-common.mk :

BOARD_USES_METADATA_PARTITION := true

שינויים ברצף ה-init

כאשר נעשה שימוש בהצפנת מטא נתונים, vold חייב לפעול לפני הטעינה של /data . כדי להבטיח שהוא מופעל מוקדם מספיק, הוסף את הבית הבא אל init.hardware.rc :

# We need vold early for metadata encryption
on early-fs
    start vold

Keymaster חייב לפעול ומוכן לפני ש-init ינסה לטעון /data .

init.hardware.rc כבר אמורה להכיל הוראת mount_all אשר מעלה את /data בעצמו בבית on late-fs . לפני שורה זו, הוסף את ההנחיה להפעלת שירות wait_for_keymaster :

on late-fs
   … 
    # Wait for keymaster
    exec_start wait_for_keymaster

    # Mount RW partitions which need run fsck
    mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late

הפעלת הצפנת מטא נתונים

לבסוף הוסף keydirectory=/metadata/vold/metadata_encryption לעמודת fs_mgr_flags של הערך fstab עבור userdata . לדוגמה, שורת fstab מלאה עשויה להיראות כך:

/dev/block/bootdevice/by-name/userdata              /data              f2fs        noatime,nosuid,nodev,discard,inlinecrypt latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable

כברירת מחדל, אלגוריתם הצפנת המטא נתונים באחסון פנימי הוא AES-256-XTS. ניתן לעקוף זאת על ידי הגדרת אפשרות metadata_encryption , גם בעמודה fs_mgr_flags :

  • במכשירים חסרי האצת AES, הצפנת Adiantum עשויה להיות מופעלת על ידי הגדרת metadata_encryption=adiantum .
  • במכשירים התומכים במפתחות עטופים בחומרה , ניתן להפוך את מפתח הצפנת המטא-נתונים לעטוף בחומרה על-ידי הגדרת metadata_encryption=aes-256-xts:wrappedkey_v0 (או באופן שווה ערך metadata_encryption=:wrappedkey_v0 , שכן aes-256-xts הוא אלגוריתם ברירת המחדל).

מכיוון שממשק הליבה ל- dm-default-key השתנה ב-Android 11, עליך גם לוודא שהגדרת את הערך הנכון עבור PRODUCT_SHIPPING_API_LEVEL ב- device.mk . לדוגמה, אם המכשיר שלך מופעל עם Android 11 (רמת API 30), device.mk צריך להכיל:

PRODUCT_SHIPPING_API_LEVEL := 30

אתה יכול גם להגדיר את מאפיין המערכת הבא כדי לאלץ את השימוש בממשק API החדש של dm-default-key ללא קשר לרמת המשלוח של ממשק API:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.dm_default_key.options_format.version=2

מַתַן תוֹקֵף

כדי לוודא שהצפנת מטא נתונים מופעלת ופועלת כהלכה, הפעל את הבדיקות המתוארות להלן. שים לב גם לבעיות הנפוצות המתוארות להלן.

מבחנים

התחל בהפעלת הפקודה הבאה כדי לוודא שהצפנת מטא נתונים מופעלת באחסון הפנימי:

adb root
adb shell dmctl table userdata

הפלט צריך להיות דומה ל:

Targets in the device-mapper table for userdata:
0-4194304: default-key, aes-xts-plain64 - 0 252:2 0 3 allow_discards sector_size:4096 iv_large_sectors

אם תעקפו את הגדרות ההצפנה המוגדרות כברירת מחדל על ידי הגדרת אפשרות metadata_encryption ב- fstab של המכשיר, אז הפלט יהיה שונה מעט מהאמור לעיל. לדוגמה, אם הפעלת את הצפנת Adiantum , אז השדה השלישי יהיה xchacha12,aes-adiantum-plain64 במקום aes-xts-plain64 .

לאחר מכן, הפעל את vts_kernel_encryption_test כדי לאמת את נכונות הצפנת המטא נתונים ו-FBE:

atest vts_kernel_encryption_test

אוֹ:

vts-tradefed run vts -m vts_kernel_encryption_test

בעיות נפוצות

במהלך הקריאה ל- mount_all , אשר מעלה את מחיצת /data המוצפנת במטא נתונים, init מפעיל את הכלי vdc. הכלי vdc מתחבר ל- vold over binder כדי להגדיר את ההתקן המוצפן עם מטא נתונים ולהעלות את המחיצה. במשך השיחה הזו, init נחסם, וניסיונות לקרוא או להגדיר מאפייני init ייחסמו עד לסיום mount_all . אם, בשלב זה, חלק כלשהו בעבודתו של vold נחסם במישרין או בעקיפין בקריאה או קביעת נכס, ייגרם מבוי סתום. חשוב להבטיח ש- vold יוכל להשלים את עבודת קריאת המפתחות, אינטראקציה עם Keymaster והרכבת ספריית הנתונים מבלי ליצור אינטראקציה נוספת עם init .

אם Keymaster אינו מופעל במלואו כאשר mount_all פועל, הוא לא יגיב ל- vold עד שהוא יקרא מאפיינים מסוימים מ- init , וכתוצאה מכך בדיוק המתואר. הצבת exec_start wait_for_keymaster מעל הפצת mount_all הרלוונטית כפי שנקבע מבטיחה ש-Keymaster פועל במלואו מראש וכך נמנע מבוי סתום.

תצורה על אחסון שניתן לאמץ

מאז אנדרואיד 9, צורה של הצפנת מטא נתונים מופעלת תמיד באחסון הניתן לאימוץ בכל פעם ש-FBE מופעל, גם כאשר הצפנת מטא נתונים אינה מופעלת באחסון פנימי.

ב-AOSP, ישנם שני יישומים של הצפנת מטא נתונים באחסון שניתן לאמץ: אחד שהוצא משימוש מבוסס על dm-crypt ואחד חדש יותר המבוסס על dm-default-key . כדי להבטיח שהיישום הנכון נבחר עבור המכשיר שלך, ודא שהגדרת את הערך הנכון עבור PRODUCT_SHIPPING_API_LEVEL ב- device.mk . לדוגמה, אם המכשיר שלך מופעל עם Android 11 (רמת API 30), device.mk צריך להכיל:

PRODUCT_SHIPPING_API_LEVEL := 30

אתה יכול גם להגדיר את מאפייני המערכת הבאים כדי לאלץ את השימוש בשיטת ההצפנה החדשה של מטא נתונים של נפח (ובגרסת ברירת המחדל החדשה של מדיניות FBE) ללא קשר לרמת ה-API למשלוח:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.volume.metadata.method=dm-default-key \
    ro.crypto.dm_default_key.options_format.version=2 \
    ro.crypto.volume.options=::v2

השיטה הנוכחית

במכשירים המופעלים עם אנדרואיד 11 ומעלה, הצפנת מטא נתונים באחסון ניתן לאמץ משתמשת במודול הקרנל dm-default-key , בדיוק כמו באחסון פנימי. ראה את התנאים המוקדמים לעיל עבור אילו אפשרויות תצורת ליבה יש להפעיל. שים לב שחומרת הצפנה מוטבעת הפועלת על האחסון הפנימי של המכשיר עשויה להיות לא זמינה באחסון הניתן לאימוץ, ולפיכך ייתכן שתידרש CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y .

כברירת מחדל, שיטת הצפנת המטא-נתונים dm-default-key משתמשת באלגוריתם ההצפנה AES-256-XTS עם מגזרי קריפטו של 4096 בתים. ניתן לעקוף את האלגוריתם על ידי הגדרת מאפיין מערכת ro.crypto.volume.metadata.encryption . לערך של מאפיין זה יש תחביר זהה לאפשרות fstab metadata_encryption שתוארה למעלה. לדוגמה, במכשירים חסרי האצת AES, הצפנת Adiantum עשויה להיות מופעלת על ידי הגדרת ro.crypto.volume.metadata.encryption=adiantum .

שיטה מורשת

במכשירים המופעלים עם אנדרואיד 10 ומטה, הצפנת מטא נתונים באחסון ניתן לאמץ משתמשת במודול ליבת dm-crypt -crypt ולא dm-default-key :

CONFIG_DM_CRYPT=y

בניגוד לשיטת dm-default-key , שיטת dm-crypt גורמת להצפנת תוכן הקובץ פעמיים: פעם אחת עם מפתח FBE ופעם אחת עם מפתח הצפנת מטא נתונים. ההצפנה הכפולה הזו מפחיתה את הביצועים ואינה נדרשת כדי להשיג את יעדי האבטחה של הצפנת מטא נתונים, שכן אנדרואיד מבטיחה שקשה להתפשר על מפתחות FBE לפחות כמו מפתח הצפנת המטא נתונים. ספקים יכולים לבצע התאמות אישיות של ליבה כדי להימנע מהצפנה כפולה, בפרט על ידי הטמעת אפשרות allow_encrypt_override אותה אנדרואיד תעביר ל- dm-crypt crypt כאשר מאפיין המערכת ro.crypto.allow_encrypt_override מוגדר כ- true . התאמות אישיות אלו אינן נתמכות על ידי הקרנל המשותף של אנדרואיד.

כברירת מחדל, שיטת הצפנת המטא נתונים של נפח dm-crypt crypt משתמשת באלגוריתם ההצפנה AES-128-CBC עם מגזרי קריפטו של ESSIV ו-512 בתים. ניתן לעקוף זאת על ידי הגדרת מאפייני המערכת הבאים (המשמשים גם עבור FDE):

  • ro.crypto.fde_algorithm בוחר את אלגוריתם הצפנת המטא נתונים. האפשרויות הן aes-128-cbc ו- adiantum . ניתן להשתמש באדיאנטום רק אם המכשיר חסר האצת AES.
  • ro.crypto.fde_sector_size בוחר את גודל מגזר ההצפנה. האפשרויות הן 512, 1024, 2048 ו-4096. להצפנת Adiantum, השתמש ב-4096.