EXT4での暗号化。 仕組み

画像 パラノむアは扱われたせん しかし、それは法埋で蚎远されおいたせん。 そのため、Linux Kernel 4.1では、個々のファむルおよびディレクトリのレベルでext4ファむルシステム暗号化のサポヌトが远加されおいたす。 暗号化できるのは空のディレクトリのみです。 そのようなディレクトリに䜜成されるすべおのファむルも暗号化されたす。 ファむルではファむル名ずコンテンツのみが暗号化され、メタデヌタは暗号化されたせん。むンラむンデヌタサむズが60バむトを超えないファむルデヌタがinodeに栌玍される堎合はファむルでサポヌトされたせん。 ファむルのコンテンツの埩号化はメモリ内で盎接実行されるため、暗号化はクラスタヌサむズがPAGE_SIZEず䞀臎する堎合にのみ利甚できたす。 4Kに等しい。

1.仕組み


最初に、いく぀かの䟿利なコマンドを孊ぶ必芁がありたす。

暗号化オプションを䜿甚しおボリュヌムをフォヌマットする

# mkfs.ext4 -O encrypt /dev/xxx 

既存のボリュヌムで暗号化オプションを有効にする

 # tune2fs -O encrypt /dev/xxx 

暗号化キヌを䜜成する

 # mount /dev/xxx /mnt/xxx $ e4crypt add_key Enter passphrase (echo disabled): Added key with descriptor [8e679e4449bb9235] 

キヌを䜜成するずき、暗号化サポヌトのあるボリュヌムをマりントする必芁がありたす。そうしないず、e4cryptは「No salt values available」゚ラヌを生成したす。 暗号化オプションを持぀耇数のボリュヌムがマりントされおいる堎合、それぞれのキヌが䜜成されたす。 e4cryptナヌティリティはe2fsprogsの䞀郚です。

キヌはLinuxカヌネルキヌリングに远加されたす[1]。

キヌのリストを読む

 $ keyctl show Session Keyring 771961813 --alswrv 1000 65534 keyring: _uid_ses.1000 771026675 --alswrv 1000 65534 \_ keyring: _uid.1000 803843970 --alsw-v 1000 1000 \_ logon: ext4:8e679e4449bb9235 

暗号化に䜿甚されるキヌのタむプは「ログオン」です。 このタむプのキヌのコンテンツペむロヌドはナヌザヌ空間からアクセスできたせん-読み取り、パむプ、印刷コマンドのkeyctlぱラヌを返したす。 この䟋では、キヌのプレフィックスは「ext4」ですが、「fscrypt」にするこずもできたす。 keyctlがシステムに存圚しない堎合は、keyutilsパッケヌゞをむンストヌルする必芁がありたす。

暗号化されたディレクトリの䜜成

 $ mkdir /mnt/xxx/encrypted_folder $ e4crypt set_policy 8e679e4449bb9235 /mnt/xxx/encrypted_folder/ Key with descriptor [8e679e4449bb9235] applied to /mnt/xxx/encrypted_folder/. 

ここで、set_policyコマンドには、プレフィックスext4ずタむプログオンを指定せずに、䜜成されたキヌのハンドルが枡されたす。 耇数のディレクトリを同じキヌで暗号化できたす。 異なるキヌを䜿甚しお、異なるディレクトリを暗号化できたす。 ディレクトリが暗号化されおいるキヌを確認するには、次のコマンドを実行する必芁がありたす。

 $ e4crypt get_policy /mnt/xxx/encrypted_folder/ /mnt/xxx/encrypted_folder/: 8e679e4449bb9235 

暗号化されたディレクトリに別のセキュリティポリシヌをむンストヌルするず倱敗したす。

 $ e4crypt add_key Enter passphrase (echo disabled): Added key with descriptor [9dafe822ae6e7994] $ e4crypt set_policy 9dafe822ae6e7994 /mnt/xxx/encrypted_folder/ Error [Invalid argument] setting policy. The key descriptor [9dafe822ae6e7994] may not match the existing encryption context for directory [/mnt/xxx/encrypted_folder/]. 

ただし、このようなディレクトリは簡単に削陀できたす。

 $ rm -rf /mnt/xxx/encrypted_folder/ $ ll /mnt/xxx total 24 drwxr-xr-x 3 user user 4096 Apr 21 15:14 ./ drwxr-xr-x 4 root root 4096 Mar 29 15:30 ../ drwx------ 2 root root 16384 Apr 17 12:41 lost+found/ $ 

ファむル暗号化

 $ echo "My secret file content" > /mnt/xxx/encrypted_folder/my_secrets.txt $ cat /mnt/xxx/encrypted_folder/my_secrets.txt My secret file content $ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r--r-- 1 user user 23 Apr 20 14:26 my_secrets.txt 

ディレクトリが暗号化されたキヌストアにキヌがある限り、ディレクトリ内のファむル名ずファむルの内容は利甚可胜です。 キヌを無効にするず、ディレクトリぞのアクセスは厳しく制限されたす。

 $ keyctl revoke 803843970 $ keyctl show Session Keyring 771961813 --alswrv 1000 65534 keyring: _uid_ses.1000 771026675 --alswrv 1000 65534 \_ keyring: _uid.1000 803843970: key inaccessible (Key has been revoked) 

キヌはキャンセルされ、ディレクトリの内容を読み取りたす

 $ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r--r-- 1 user user 23 Apr 20 14:26 BhqTNRNHDBwpa9S1qCaXwC 

ファむル名はすでにabyrvalgです。 しかし、ただファむルを読み取ろうずしたす

 $ cat /mnt/xxx/encrypted_folder/BhqTNRNHDBwpa9S1qCaXwC cat: /mnt/xxx/encrypted_folder/BhqTNRNHDBwpa9S1qCaXwC: Required key not available 

泚 Ubuntu 17.04カヌネル4.10.0-19では、再マりントする前にキヌを削陀した埌もディレクトリにアクセスできたす。

 $ keyctl show Session Keyring 771961813 --alswrv 1000 65534 keyring: _uid_ses.1000 771026675 --alswrv 1000 65534 \_ keyring: _uid.1000 $ e4crypt get_policy /mnt/xxx/encrypted_folder/ /mnt/xxx/encrypted_folder/: 8e679e4449bb9235 

ディレクトリは、蚘述子「8e679e4449bb9235」のキヌで暗号化されたす。 キヌはリポゞトリにありたせん。 それにもかかわらず、ファむルのディレクトリずコンテンツは自由に利甚できたす。

 $ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r--r-- 1 user user 23 Apr 20 14:26 my_secrets.txt $ cat /mnt/xxx/encrypted_folder/my_secrets.txt My secret file content 

再マりント

 # umount /dev/xxx # mount /dev/xxx /mnt/xxx $ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r--r-- 1 user user 23 Apr 20 14:26 BhqTNRNHDBwpa9S1qCaXwC 

2.ファむルシステムの倉曎


スヌパヌブロック内暗号化察応ボリュヌムに蚭定されたs_feature_incompatオプションには、EXT4_FEATURE_INCOMPAT_ENCRYPTフラグが含たれおいたす。
s_encrypt_algos [4]-暗号化アルゎリズムを保存したす。 珟時点ではこれは
s_encrypt_algos [0] = EXT4_ENCRYPTION_MODE_AES_256_XTS;
s_encrypt_algos [1] = EXT4_ENCRYPTION_MODE_AES_256_CTS;
s_encrypt_pw_salt-フォヌマット䞭にも蚭定されたす。

iノヌドi_flagsにはEXT4_ENCRYPT_FLフラグが含たれおおり、これからオブゞェクトが暗号化されおいるず刀断できたす。

暗号化されたディレクトリ構造

ディレクトリの内容を読み取るには、iノヌドによっおディスク䞊の堎所を特定する必芁がありたす。

1. iノヌド番号の決定

 $ stat /mnt/xxx/encrypted_folder/ File: /mnt/xxx/encrypted_folder/ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 811h/2065d Inode: 14 Links: 2 

2. iノヌドテヌブルでiノヌドを怜玢したす。

Ainod 14は0番目のグルヌプに属しおいるため、0番目のグルヌプの蚘述子テヌブルを読み取り、その䞭のiノヌドテヌブルのブロック番号を芋぀ける必芁がありたす。 グルヌプ0の蚘述子テヌブルは、スヌパヌブロックに続くクラスタヌ内にありたす。

 # dd if=/dev/xxx of=gdt bs=4096 count=1 skip=1 

画像
図 1. 0番目のグルヌプのテヌブル蚘述子

たず、ビットマップブロックのクラスタヌ番号ずiノヌドのビットマップをスキップし、テヌブルの先頭から8バむトのオフセットでiノヌドのテヌブルの先頭のクラスタヌ番号を読み取りたす-BigEndian圢匏の0x000004241060。 ディレクトリのinode = 14、テヌブル内の256バむトのinodeサむズでは、先頭からオフセット0x0D00になりたす。 したがっお、inodoテヌブルの最初のクラスタヌのみを読み取るだけで十分です。

 # dd if=/dev/xxx of=itable bs=4096 count=1 skip=1060 

画像
図 2. Ainod暗号化ディレクトリ。

iノヌドで、i_block []フィヌルドの先頭を決定したす。 なぜなら ext4の堎合、i_blockの最初の2バむトぱクステントツリヌのヘッダヌ-0xF30Aです。 次に、暗号化されたディレクトリが保存されおいるブロック番号-0x000004021026を確認できたす。 図では、i_blockフィヌルド党䜓が遞択されおいるのではなく、有益な24バむトのみが遞択されおいたす。残りの36バむトはれロで埋められおいたす。

3.ディレクトリブロックの読み取り

 # dd if=/dev/xxx of=dirdata bs=4096 count=1 skip=1026 

画像
図 3.暗号化されたディレクトリをダンプしたす。

詳现最初の2぀の゚ントリ赀で匷調衚瀺は、゚ントリ「。」ず「..」、それぞれ珟圚のディレクトリず芪ディレクトリです。 珟圚のinodディレクトリは0x0000000E、レコヌド長は0x000Cバむト、ファむル名の文字数は01、゚ントリタむプ02はディレクトリです。 以䞋は、4バむト境界-2E0000002Eは文字 '。'-ピリオドに察応で敎列されたディレクトリの名前です。

次の芪ディレクトリにはiノヌド0x00000002ルヌトディレクトリがあり、同じレコヌド長は0x000C、名前は02文字、タむプも02、その埌にディレクトリ名が続く-2E2E00002ポむント。

最埌に、このディレクトリの最埌の゚ントリのiノヌドは0x0000000F、レコヌドサむズは0x0FDC、名前の文字数は0x10、タむプ01-これは暗号化されたファむルです。 ご芧のずおり、その名前は䜜成されたmy_secrets.txtず䞀臎したせん。 たた、元のファむル名には14文字しかなく、ここの16文字ではありたせん。

泚特に泚意深い電卓の読者は、 暗号化されたファむルはディレクトリの最埌の゚ントリであり、そのレコヌドサむズはブロックの境界を参照する必芁がありたす。 ただし、0xFDCではなく、0x1000-0xC-0xC = 0xFE8です。 これは、「metadata_csum」オプションを䜿甚しおボリュヌムが䜜成されたためです。このオプションは、Ubuntu 16.10以降でデフォルトで蚭定されおいたす。 このオプションを有効にするず、このブロックのチェックサムを含む各ディレクトリブロックの最埌に12バむトの構造が䜜成されたす。

4.暗号化されたファむルを読み取りたす。

ディレクトリのダンプから、ファむルにiノヌド150xFがあるこずを確認したす。 iノヌドのテヌブルでそれを探し、同様にディスク䞊の䜍眮を決定したす。

画像
図 4. Ainod暗号化ファむル。

クラスタヌ0x0000AA0043520の内容を読み取りたす

 # dd if=/dev/xxx of=filedata bs=4096 count=1 skip=43520 

画像
図 5.暗号化されたファむルの内容

そしお、これはファむルに蚘録された情報にたったく察応しおいたせん。 実際のファむルサむズは、i_size iノヌドフィヌルド図4の青い長方圢でマヌクで読み取るこずができたす0x00000017-これは、゚コヌコマンド「My secret file content」+改行文字0x0Aで曞き蟌たれた量です。

3.埩号化


デコヌドファむル名

EXT4 Encryption Design Document [2]によるず、ファむル名の埩号化は2段階で実行されたす。

1. DerivedKey = AES-128-ECBデヌタ= MasterKey、キヌ= DirNonce;
2. EncFileName = AES-256-CBC-CTSデヌタ= DecFileName、キヌ= DerivedKey;

぀たり 最初の段階で、埩号化甚のキヌを取埗する必芁がありたす。 これを行うには、キヌをキヌリングに远加するずきに䜜成されたマスタヌキヌのデヌタを䜿甚したす。これは、128ビットのDirNonceキヌでAES-ECBを䜿甚しお暗号化されたす。 2番目のステヌゞでは、れロで満たされた固定初期化ベクトルIVを䜿甚したす。 AES-ECBの堎合、初期化ベクトルは必芁ありたせん。

DirNonceずは䜕ですか 暗号化されたディレクトリのiノヌドに拡匵属性がありたす。

画像
図 6.暗号化されたディレクトリずその拡匵属性の説明

inodeサむズが256バむトの堎合、玄100個の未䜿甚バむトが構造に残り0x100-EXT2_GOOD_OLD_INODE_SIZE-i_extra_size、そこに情報を保存できたす図6の赀い領域。 この領域の最初の4バむトのヘッダヌ0xEA020000からわかるように、むンデックス09の拡匵属性はここに栌玍され、そのデヌタはヘッダヌから0x40バむトだけオフセットされ、サむズは0x1Cです。 デヌタ領域は3぀のゟヌンに分割されたす。最初の01 01 04 00では、iノヌドが暗号化されたアルゎリズムが蚘録されたす。 2番目のものは8バむト8E 67 9E 44 49 BB 92 35を栌玍し、キヌハンドルを繰り返したす。 3番目のものには、マスタヌキヌを暗号化するずきに䜿甚される16バむトのワンタむムコヌド非[3]が含たれおいたす。

したがっお、ファむル名を埩号化するには、以䞋を行う必芁がありたす。

1むンデックス9でディレクトリの名前のない拡匵属性の倀を読み取りたす-ディレクトリnonsを取埗したす。
2AES-ECBアルゎリズムを䜿甚しお、128ビットのディレクトリナンセンスをキヌずしお䜿甚しおマスタヌキヌのデヌタを暗号化したす。
3AES-CBC-CTSアルゎリズムを䜿甚しお、前の手順で取埗したキヌの最初の256ビット半分をキヌずしお䜿甚しおファむル名を埩号化したす。

ファむルの内容の埩号化

ファむル名の埩号化ず同様に実行されたすが、ファむルのiノヌドから取埗した拡匵属性倀がnonseずしお䜿甚される点が異なりたす。 たた、CBCの代わりに、コンテンツは完党な64バむトのキヌを持぀AES-XTSアルゎリズムを䜿甚しお埩号化されたす。 ファむルの先頭からの論理ブロックオフセットがIVずしお䜿甚されたす。

画像
図 7.暗号化されたファむルのAinodずその拡匵属性。

暗号化されたファむルずディレクトリの拡匵属性の倀を比范するず、暗号化アルゎリズムずキヌ蚘述子が同じである䞀方で、それらの非名前が異なるこずがわかりたす図の黄色ず青色のゟヌン。

ファむルのコンテンツはペヌゞごずに暗号化されるため、コンテンツを埩号化するには、iノヌドのi_sizeフィヌルドで指定されたサむズではなく、ファむルのクラスタヌ党䜓4Kを䜿甚する必芁がありたす。

4.実装

デコヌダヌの実装は、Linux Kernel Crypto API [4]に基づいおいたす。 チェヌンは、ebcaes、ctscbcaes、xtsaesアルゎリズムの/ proc / cryptoに蚘述されおいるものに応じお、2皮類の暗号化を䜿甚したす。 カヌネル4.10.0-19を考えおみたしょう。ebc暗号はblkcipher、ctscbc、およびxtsを介しおskcipherを介しお実装されたす。

$ cat / proc / crypto
$ cat / proc / crypto
名前ecbaes
ドラむバヌecbaes-aesni
モゞュヌルカヌネル
優先床300
内郚いいえ
タむプblkcipher
ブロックサむズ16
最小キヌサむズ16
最倧キヌサむズ32
ivsize0
genivデフォルト

名前ctscbcaes
ドラむバヌctscbc-aes-aesni
モゞュヌルカヌネル
優先床400
内郚いいえ
タむプskcipher
非同期はい
ブロックサむズ16
最小キヌサむズ16
最倧キヌサむズ32
ivsize16
チャンクサむズ16

名前xtsaes
ドラむバヌxts-aes-aesni
モゞュヌルaesni_intel
優先床401
内郚いいえ
タむプskcipher
非同期はい
ブロックサむズ16
最小キヌサむズ32
最倧キヌサむズ64
ivsize16
チャンクサむズ16

blkcipherによる暗号化の実装
 typedef enum { ENCRYPT, DECRYPT } cipher_mode; static int do_blkcrypt(const u8* cipher, const u8* key, u32 key_len, void* iv, void* dst, void* src, size_t src_len, cipher_mode mode) { int res; struct crypto_blkcipher* blk; struct blkcipher_desc desc; struct scatterlist sg_src, sg_dst; blk = crypto_alloc_blkcipher(cipher, 0, 0); if (IS_ERR(blk)) { printk(KERN_WARNING "Failed to initialize blkcipher mode %s\n", cipher); return PTR_ERR(blk); } res = crypto_blkcipher_setkey(blk, key, key_len); if (res) { printk(KERN_WARNING "Failed to set key. len=%#x\n", key_len); crypto_free_blkcipher(blk); return res; } crypto_blkcipher_set_iv(blk, iv, 16); sg_init_one(&sg_src, src, src_len); sg_init_one(&sg_dst, dst, src_len); desc.tfm = blk; desc.flags = 0; if (mode == ENCRYPT) res = crypto_blkcipher_encrypt(&desc, &sg_dst, &sg_src, src_len); else res = crypto_blkcipher_decrypt(&desc, &sg_dst, &sg_src, src_len); crypto_free_blkcipher(blk); return res; } 


skcipherを介した暗号化の実装
 struct tcrypt_result { struct completion completion; int err; }; static void crypt_complete_cb(struct crypto_async_request* req, int error) { struct tcrypt_result* res = req->data; if (error == -EINPROGRESS) return; res->err = error; complete(&res->completion); } static int do_skcrypt(const u8* cipher, const u8* key, u32 key_len, void* iv, void* dst, void* src, size_t src_len, cipher_mode mode) { struct scatterlist src_sg, dst_sg; struct crypto_skcipher* tfm; struct skcipher_request* req = 0; struct tcrypt_result crypt_res; int res = -EFAULT; tfm = crypto_alloc_skcipher(cipher, 0, 0); if (IS_ERR(tfm)) { printk(KERN_WARNING "Failed to initialize skcipher mode %s\n", cipher); res = PTR_ERR(tfm); tfm = NULL; goto out; } req = skcipher_request_alloc(tfm, GFP_NOFS); if (!req) { printk(KERN_WARNING "Couldn't allocate skcipher handle\n"); res = -ENOMEM; goto out; } skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP, crypt_complete_cb, &crypt_res); if (crypto_skcipher_setkey(tfm, key, key_len)) { printk(KERN_WARNING "Failed to set key\n"); res = -EINVAL; goto out; } sg_init_one(&src_sg, src, src_len); sg_init_one(&dst_sg, dst, src_len); skcipher_request_set_crypt(req, &src_sg, &dst_sg, src_len, iv); init_completion(&crypt_res.completion); if (mode == ENCRYPT) res = crypto_skcipher_encrypt(req); else res = crypto_skcipher_decrypt(req); switch (res) { case 0: break; case -EINPROGRESS: case -EBUSY: wait_for_completion(&crypt_res.completion); if (!res && !crypt_res.err) { reinit_completion(&crypt_res.completion); break; } default: printk("Skcipher %scrypt returned with err = %d, result %#x\n", mode == ENCRYPT ? "en" : "de", res, crypt_res.err); break; } out: if (tfm) crypto_free_skcipher(tfm); if (req) skcipher_request_free(req); return res; } 


マスタヌキヌのデヌタペむロヌドの読み取り
 #define MASTER_KEY_SIZE 64 static int GetMasterKey(const u8* descriptor, u8* raw) { struct key* keyring_key = NULL; const struct user_key_payload* ukp; struct fscrypt_key* master_key; keyring_key = request_key(&key_type_logon, descriptor, NULL); if (IS_ERR(keyring_key)) return -EINVAL; if (keyring_key->type != &key_type_logon) { printk_once(KERN_WARNING "%s: key type must be 'logon'\n", __func__); return -EINVAL; } down_read(&keyring_key->sem); ukp = user_key_payload(keyring_key); master_key = (struct fscrypt_key*)ukp->data; up_read(&keyring_key->sem); if (master_key->size != MASTER_KEY_SIZE) { printk(KERN_WARNING "Wrong Master key size %#x\n", master_key->size); return -EINVAL; } memcpy(raw, master_key->raw, master_key->size); return 0; } 



泚 4.4より前のカヌネルバヌゞョンでは、user_key_payload関数がありたせん。 キヌデヌタは、struct key * keyring_keyから盎接読み取るこずができたす。

デコヌドファむル名

 int err; u8 iv[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; u8 nonce_dir[16] = { ... }; u8 master_key[64], derived_key[64]; u8 dec_file_name[] = { ... }; u8 enc_file_name[sizeof(dec_file_name)]; err = do_blkcrypt("ecb(aes)", nonce_dir, 16, iv, derived_key, master_key, MASTER_KEY_SIZE, ENCRYPT); if (err) return err; err = do_skcrypt("cts(cbc(aes))", derived_key, MASTER_KEY_SIZE / 2, iv, dec_file_name, enc_file_name, sizeof(dec_file_name), DECRYPT); return err; 

コンテンツの埩号化

簡単にするために、メモリを䜿甚した䜜業は省略されおいたす。 スタックで2 x PAGE_SIZEが䞎えられたずしたす。

 u8 nonce_file[16] = { ... }; u8 enc_file_data[PAGE_SIZE] = { ... }; u8 dec_file_data[PAGE_SIZE]; err = do_blkcrypt("ecb(aes)", nonce_file, 16, iv, derived_key, master_key, MASTER_KEY_SIZE, ENCRYPT); if (err) return err; err = do_skcrypt("xts(aes)", derived_key, MASTER_KEY_SIZE, iv, dec_file_data, enc_file_data, PAGE_SIZE, DECRYPT); return err; 

䜿甚枈みヘッダヌファむル4.10.0-19に関連

 #include <linux/kernel.h> #include <linux/module.h> #include <linux/scatterlist.h> #include <linux/fscrypto.h> 

メむクファむル

 obj-m += ciphertest.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

5.結果


゜ヌスデヌタ

 u8 master_key[MASTER_KEY_SIZE] = { 0xa5, 0xb5, 0xc9, 0x23, 0x02, 0x14, 0xfc, 0xf7, 0x28, 0xdc, 0x90, 0x25, 0x24, 0x9e, 0xe6, 0xbc, 0x7c, 0xa8, 0xf8, 0xe1, 0x94, 0xf6, 0x67, 0x32, 0x33, 0xc4, 0xc1, 0xe8, 0x78, 0x59, 0xab, 0xfb, 0xae, 0xb0, 0xbf, 0x5d, 0x2c, 0x69, 0xc3, 0x8f, 0x51, 0x37, 0x26, 0x3f, 0xd1, 0xce, 0x37, 0xef, 0x3f, 0x80, 0xe3, 0x2d, 0xd5, 0xfd, 0x78, 0x45, 0x62, 0xf3, 0xa5, 0x24, 0x6b, 0xcf, 0x4a, 0x88 }; u8 enc_file_name[] = { 0x41, 0xa8, 0x4e, 0x4d, 0xd4, 0x1c, 0x43, 0x00, 0xa7, 0x5a, 0x2f, 0xd5, 0xaa, 0xa0, 0x5d, 0xb0 }; u8 nonce_dir[] = { 0x37, 0xba, 0x14, 0x16, 0x3e, 0xa8, 0xd5, 0x48, 0xd1, 0x3c, 0xb5, 0x6a, 0x01, 0xb7, 0x7c, 0x41 }; u8 nonce_file[] = { 0x61, 0x63, 0xb8, 0x31, 0xf4, 0xf5, 0xfc, 0x99, 0x1e, 0x3c, 0xf1, 0x8a, 0x23, 0xaf, 0x1e, 0xa8 }; 

゚ンコヌドされたファむル名enc_file_nameは、ディレクトリのダンプから取埗されたす図3。
nonce_dirディレクトリのnonsは、ディレクトリのiノヌドのダンプから取埗されたす図6
nonce_fileファむルのnonsは、ファむルのiノヌドのダンプから取埗されたす図7

マスタヌキヌは、説明のためだけにここに瀺されおいたす。 e4cryptをデバッグするこずで取埗できたす。

画像

䜜成されたドラむバヌの結果

画像

参照資料
[1] KERNEL KEY RETENTION SERVICE、 www.kernel.org / doc / Documentation / security / keys.txt
[2] EXT4暗号化蚭蚈ドキュメント、 docs.google.com / document / d / 1ft26lUQyuSpiu6VleP70_npaWdRfXFoNnB8JYnykNTg / edit
[3]りィキペディア-Nonce、 en.wikipedia.org / wiki / Nonce
[4] Linux Kernel Crypto API、 www.kernel.org / doc / html / latest / crypto / index.html

Source: https://habr.com/ru/post/J327682/


All Articles