Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement block addressing format #16

Merged
merged 16 commits into from
Jun 20, 2024

Conversation

aruneko
Copy link
Contributor

@aruneko aruneko commented Jun 5, 2024

overview

If an ext4 filesystem is transformed from ext3 or ext2, it uses block addressing format instead of extents. In this case, this library can't read files from the disk. Therefore, I implemented a method to get files on block addressing format.

others

  • I have confirmed to parse double indirect block addressing.
  • It seems that this commits make the library support ext2 and ext3.

概要

ext3 などから移行されたファイルシステムで Block Addressing 形式でファイルが書き込まれていて、extent を利用していない場合にファイルが取れなかったため、Block Addressing 方式のサポートを追加しました。

その他

  • double indirect block addressing まで動作確認してます
  • 軽く検証したところ、副次的に Ext2 / Ext3 が読み込めるようになったようです

@knqyf263 knqyf263 requested a review from masahiro331 June 5, 2024 07:29
Comment on lines +211 to +233
if addresses.SingleIndirectBlock != 0 {
singleIndirectBlockAddresses, err := resolveSingleIndirectBlockAddress(ext4, addresses.SingleIndirectBlock)
if err != nil {
return nil, xerrors.Errorf("failed to read single indirect block addressing: %w", err)
}
blockAddresses = append(blockAddresses, singleIndirectBlockAddresses...)
}

if addresses.DoubleIndirectBlock != 0 {
doubleIndirectBlockAddresses, err := resolveDoubleIndirectBlockAddress(ext4, addresses.DoubleIndirectBlock)
if err != nil {
return nil, xerrors.Errorf("failed to read double indirect block addressing: %w", err)
}
blockAddresses = append(blockAddresses, doubleIndirectBlockAddresses...)
}

if addresses.TripleIndirectBlock != 0 {
tripleIndirectBlockAddresses, err := resolveTripleIndirectBlockAddress(ext4, addresses.TripleIndirectBlock)
if err != nil {
return nil, xerrors.Errorf("failed to read triple indirect block addressing: %w", err)
}
blockAddresses = append(blockAddresses, tripleIndirectBlockAddresses...)
}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これって全て存在するパターンや一部存在するパターンなどあるんですかね?
どういった組み合わせが存在するのか気になってます

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Block Addressingの制約で、1ファイルのサイズが1Blockのサイズを超えたときのためにこのような管理方法が取られているようです。

https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Direct.2FIndirect_Block_Addressing

ここからサイズを計算すると、ファイルサイズが4GBを超えるとTripleまで全て存在するようになります。4MBを超えるとDoubleまで、4KBを超えるとSingleまでになるはずです。少ない方から順番に詰められていくので、途中で飛ばしたりという組み合わせはなさそうです。

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なるほどです。拡張されていく仕様ですか。
ありがとうございます。

@masahiro331
Copy link
Owner

VMDKなどのイメージから透過的に読み取れることが確認できてますか?

@aruneko
Copy link
Contributor Author

aruneko commented Jun 9, 2024

VMDKなどのイメージから透過的に読み取れることが確認できてますか?

Trivy側の依存関係を編集してこのパッチを組み込んだものをEBSスキャンで動かしています。既存のExt4/Xfs環境を含めてスキャン結果は取得できているところまでは確認しています。

@masahiro331
Copy link
Owner

VMDKなどのイメージから透過的に読み取れることが確認できてますか?

Trivy側の依存関係を編集してこのパッチを組み込んだものをEBSスキャンで動かしています。既存のExt4/Xfs環境を含めてスキャン結果は取得できているところまでは確認しています。

VMDKにエクスポートしたものに対してスキャンできるか検証できますか?

@aruneko
Copy link
Contributor Author

aruneko commented Jun 9, 2024

VMDKにエクスポートしたものに対してスキャンできるか検証できますか?

承知です、明日検証してみます。

@aruneko
Copy link
Contributor Author

aruneko commented Jun 12, 2024

色々嵌まってしまって遅くなりました。

以下検証内容です。

既存スキャン機能への影響調査

AWS EC2 で Debian AMI から起動して root volume を VMDK としてエクスポートしたものをスキャンして、既存の Ext4 に対するスキャンが問題ないことを確認しました。

Ext3 への対応調査

上記の環境を流用して、以下の手順で Ext3 EBS ボリュームを作成し、VMDK に変換したイメージに対してスキャンが行われることを確認しました。

$ sudo parted /dev/xvdb
parted) mklabel gpt
parted) mkpart primary ext3 1MiB 100%
parted) quit
$ sudo mkfs.ext3 /dev/xvdb1
$ sudo mount /dev/xvdb1 /mnt/ext3/
$ sudo cp -a /etc/ /mnt/ext3/etc/
$ sudo cp -a /var/ /mnt/ext3/var/
$ sudo dd if=/dev/xvdb > ext3.img
$ vboxmanage convertfromraw --format VMDK --variant Stream ext3.img ext3.vmdk
$ ./trivy vm --scanners vuln ext3.vmdk

ext4/fs.go Outdated Show resolved Hide resolved
ext4/fs.go Outdated Show resolved Hide resolved
aruneko and others added 2 commits June 14, 2024 13:34

doubleIndirectBlockAddresses, err := resolveDoubleIndirectBlockAddress(ext4, doubleIndirectBlockAddress)
if err != nil {
return nil, xerrors.Errorf("failed to read double indirect block addressing: %w", err)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここ全体的にですが、エラーが発生したアドレスがわかるようにしたいです。ブロックのアドレスなどdebugの時にxxd とかで参照できると嬉しい(他のところが十分にできてないので心苦しいですが)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ひとまず single/double/triple の block addresses を解決するところで、エラーメッセージ中にブロックアドレスを表示するようにしてみました。
22dd741

@knqyf263
Copy link
Collaborator

全然見てないけど良いと思います!

@masahiro331 masahiro331 merged commit ca14e63 into masahiro331:main Jun 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants