אנדרואיד 7.0 ואילך תומך בהצפנה מבוססת קבצים (FBE). FBE מאפשר להצפין קבצים שונים בעזרת מפתחות שונים הניתנים לביטול הנעילה באופן עצמאי. מפתחות אלה משמשים להצפנת תוכן קבצים ושמות קבצים. כאשר נעשה שימוש ב-FBE, מידע אחר, כגון פריסות ספריות, גדלי קבצים, הרשאות וזמני יצירה/שינוי, אינו מוצפן. ביחד, מידע נוסף זה ידוע כמטא נתונים של מערכת הקבצים.
אנדרואיד 9 הציגה תמיכה בהצפנת מטא נתונים. עם הצפנת מטא נתונים, מפתח יחיד הקיים בזמן האתחול מצפין כל תוכן שאינו מוצפן על ידי FBE. מפתח זה מוגן על ידי Keymaster, אשר בתורו מוגן על ידי אתחול מאומת.
הצפנת מטא נתונים מופעלת תמיד באחסון שניתן לאמץ בכל פעם ש-FBE מופעל. ניתן להפעיל הצפנת מטא נתונים גם באחסון פנימי. במכשירים המופעלים עם אנדרואיד 11 ומעלה חייבת להיות מופעלת הצפנת מטא נתונים באחסון פנימי.
יישום על אחסון פנימי
ניתן להגדיר הצפנת מטא נתונים באחסון הפנימי של מכשירים חדשים על ידי הגדרת מערכת הקבצים metadata
, שינוי רצף הפתיחה והפעלת הצפנת מטא נתונים בקובץ 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
שינויים ברצף הפתיחה
כאשר נעשה שימוש בהצפנת מטא נתונים, 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
volume metadata משתמשת באלגוריתם ההצפנה AES-256-XTS עם מגזרי קריפטו של 4096 בתים. ניתן לעקוף את האלגוריתם על ידי הגדרת מאפיין מערכת ro.crypto.volume.metadata.encryption
. לערך של מאפיין זה יש תחביר זהה לאפשרות fstab metadata_encryption
שתוארה למעלה. לדוגמה, במכשירים חסרי האצת AES, הצפנת Adiantum עשויה להיות מופעלת על ידי הגדרת ro.crypto.volume.metadata.encryption=adiantum
.
שיטה מדור קודם
במכשירים המופעלים עם אנדרואיד 10 ומטה, הצפנת מטא נתונים באחסון ניתן לאמץ משתמשת במודול ליבת dm-crypt
ולא dm-default-key
:
CONFIG_DM_CRYPT=y
בניגוד לשיטת dm-default-key
, שיטת dm-crypt
גורמת להצפנת תוכן הקובץ פעמיים: פעם אחת עם מפתח FBE ופעם אחת עם מפתח הצפנת מטא נתונים. ההצפנה הכפולה הזו מפחיתה את הביצועים ואינה נדרשת כדי להשיג את יעדי האבטחה של הצפנת מטא נתונים, שכן אנדרואיד מבטיחה שקשה להתפשר על מפתחות FBE לפחות כמו מפתח הצפנת המטא נתונים. ספקים יכולים לבצע התאמות אישיות של ליבה כדי להימנע מההצפנה הכפולה, במיוחד על ידי הטמעת אפשרות allow_encrypt_override
אותה אנדרואיד תעביר ל- dm-crypt
כאשר מאפיין המערכת ro.crypto.allow_encrypt_override
מוגדר כ- true
. התאמות אישיות אלו אינן נתמכות על ידי הקרנל המשותף של אנדרואיד.
כברירת מחדל, שיטת הצפנת המטא נתונים של נפח dm-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.