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

[secure boot] Support rw files allowlist #4585

Merged
merged 9 commits into from
Jun 13, 2020
Merged

Conversation

xumia
Copy link
Collaborator

@xumia xumia commented May 13, 2020

- Why I did it
The files without signature validation may be tempered when the switch is turned off, it is required to remove the files in the rw folder which will be executed when system starts for the secure boot. we will remove all the executable files and all the file not in the allowlist config file, only allow limited config files to improve the security.

- How I did it
The allowlist config file "files/image_config/secureboot/allowlist_paths.conf" is to control whether the rw files in root file system will be removed or not when the system reboot. The config file will be extracted from the signed and verified image in each reboot.
The Linux kernel will take the process to remove files in the union-mount just before mounting the rw folder.

- How to verify it

- Description for the changelog
Remove the files in rw folder of the overlay file system based on a allowlist config file.

- A picture of a cute animal (not mandatory but encouraged)

@@ -395,6 +395,9 @@ write_boot_configs() {
fi
fi

# setting secure_boot_enable=true when secure boot enabled
[ -f /bin/securebootctl ] && securebootctl secureboot -display | grep -i "Secure Boot enable" -q && echo "secure_boot_enable=true" >> /tmp/append
Copy link
Collaborator

@qiluo-msft qiluo-msft May 13, 2020

Choose a reason for hiding this comment

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

securebootctl secureboot -display | grep -i "Secure Boot enable" -q [](start = 33, length = 67)

Is it possible to test secure boot enabled without grep? #Pending

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I will ask Arista about it.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The arista secure boot using the similar way.

etc/subuid
etc/tacplus_nss.conf
etc/tacplus_user
lib/systemd/system/serial-getty@.service
Copy link
Collaborator

@qiluo-msft qiluo-msft May 13, 2020

Choose a reason for hiding this comment

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

Need to double check #Closed

build_image.sh Outdated
@@ -133,6 +133,7 @@ elif [ "$IMAGE_TYPE" = "aboot" ]; then
sed -i -e "s/%%IMAGE_VERSION%%/$IMAGE_VERSION/g" files/Aboot/boot0
pushd files/Aboot && zip -g $OLDPWD/$OUTPUT_ABOOT_IMAGE boot0; popd
pushd files/Aboot && zip -g $OLDPWD/$ABOOT_BOOT_IMAGE boot0; popd
pushd files/image_config/secureboot && zip -g $OLDPWD/$OUTPUT_ABOOT_IMAGE whitelist; popd
Copy link
Collaborator

@qiluo-msft qiluo-msft May 13, 2020

Choose a reason for hiding this comment

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

whitelist [](start = 78, length = 9)

Name it as whitelist_paths.txt ? #Closed

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Can we use whitelist_paths? Do we need to remove the .txt when added into the image package?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Changed to whitelist_paths.conf

fi

# Return if the secure_boot_enable option is not set
if cat /proc/cmdline | grep -v -q "secure_boot_enable=true"; then
Copy link
Collaborator

@qiluo-msft qiluo-msft May 13, 2020

Choose a reason for hiding this comment

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

secure_boot_enable=true [](start = 37, length = 23)

The convention is
secure_boot_enable=[0|1]
or
secure_boot_enable=[n|y]
#Closed

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fixed.


whitelist_log=${rootmnt}/host/$image_dir/whitelist.log
rw_dir=${rootmnt}/host/$image_dir/rw
whitelist=$(cat ${rootmnt}/host/$image_dir/whitelist | grep -v "^\s*#" | awk '{$1=$1};1')
Copy link
Collaborator

@qiluo-msft qiluo-msft May 13, 2020

Choose a reason for hiding this comment

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

| grep -v "^\s*#" | awk '{$1=$1};1' [](start = 54, length = 36)

Is it only for parsing comments? If yes, we may remove the complexity. And add a whiltelist_README.md side-by-side to explain usage. #Closed

Copy link
Collaborator

Choose a reason for hiding this comment

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

Offline discussed, move comment out into separate file. It is not a runtime conf file.


In reply to: 424122684 [](ancestors = 424122684)

echo $file >> ${whitelist_log}
rm -f $file
fi
done
Copy link
Collaborator

@qiluo-msft qiluo-msft May 13, 2020

Choose a reason for hiding this comment

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

I am worried about the performance if rw contains many files and deep directories. Since whitelist is short, can we mv folder to a temp one, and copied back one by one.

Not sure the validation of this solution, is there any metadata / hidden files in rw for overlay?

If it working, no need to add /* for directories in whitelist. #Closed

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The find command can get hidden files, what is the metadata?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yes, the performance is not good enough, but it is not relative to the depth of the directories, it is the grep.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The performance issue should be fixed. Tested on the device, reduce from 100 seconds to 1 seconds for 300 files. And checked the changed files on product, it only has about 700 changed files in max.

@@ -39,10 +39,49 @@ set_tmpfs_log_partition_size()
[ $maxsize -le $varlogsize ] && varlogsize=$maxsize
}

whitelist_rw_folder()
Copy link
Collaborator

@qiluo-msft qiluo-msft May 13, 2020

Choose a reason for hiding this comment

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

Sh code is not easy to understand, add some comments? #Closed

@jleveque jleveque changed the title Support rw files whitelist for Sonic Secure Boot [secure boot] Support rw files whitelist May 13, 2020
@jleveque
Copy link
Contributor

FYI, I updated the PR title.


# Set the grep pattern file
whitelist_pattern_file=${rootmnt}/host/$image_dir/whitelist_paths.pattern
grep -v "^\s*$" ${whitelist_file} | awk -v rw_dir="$rw_dir" '{print rw_dir"/"$0"$"}' > $whitelist_pattern_file
Copy link
Collaborator

@qiluo-msft qiluo-msft May 26, 2020

Choose a reason for hiding this comment

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

awk [](start = 38, length = 3)

Can we use awk to handle empty line https://stackoverflow.com/a/11687266/2514803
And remove grep. #Closed

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fixed.

@lguohan
Copy link
Collaborator

lguohan commented May 31, 2020

please add descriptions for the pr

@@ -39,10 +39,38 @@ set_tmpfs_log_partition_size()
[ $maxsize -le $varlogsize ] && varlogsize=$maxsize
}

whitelist_rw_folder()
{
image_dir=$1
Copy link
Contributor

Choose a reason for hiding this comment

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

If it doesn't bother you too much. can you switch to 4 space indentation? Most of our files are 4 space indentations.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fixed.

whitelist_file=${rootmnt}/host/$image_dir/whitelist_paths.conf

# Return if the whitelist file does not exist
if ! test -f "${whitelist_file}"; then
Copy link
Contributor

Choose a reason for hiding this comment

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

Should this check be moved down or add as a protection of accessing the file?

If secure boot is enabled and this file is missing, should you at least whitelist rw_dir? I understand that is not enough.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The file should not be missing, it is extracted from the image every time in boot0.
If secure boot enabled, the file should always exist, I will improve it.

Comment on lines 398 to 399
# setting secure_boot_enable=true when secure boot enabled
[ -f /bin/securebootctl ] && securebootctl secureboot -display | grep -i "Secure Boot enable" -q && echo "secure_boot_enable=y" >> /tmp/append
Copy link
Contributor

Choose a reason for hiding this comment

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

Comment and code does not match, is it supposed to be "secure_boot_enable=true" or "secure_boot_enable=y"?

## Mount the overlay file system: rw layer over squashfs
image_dir=$(cat /proc/cmdline | sed -e 's/.*loop=\(\S*\)\/.*/\1/')
mkdir -p ${rootmnt}/host/$image_dir/rw
mkdir -p ${rootmnt}/host/$image_dir/work
## Whitelist rw folder
whitelist_rw_folder "$image_dir"
Copy link
Contributor

Choose a reason for hiding this comment

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

suggest name change to reflect the fact that files are removed.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Changed to remove_not_whitelist_files

## Mount the overlay file system: rw layer over squashfs
image_dir=$(cat /proc/cmdline | sed -e 's/.*loop=\(\S*\)\/.*/\1/')
mkdir -p ${rootmnt}/host/$image_dir/rw
mkdir -p ${rootmnt}/host/$image_dir/work
## Whitelist rw folder
whitelist_rw_folder "$image_dir"
Copy link
Collaborator

@qiluo-msft qiluo-msft Jun 2, 2020

Choose a reason for hiding this comment

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

$image_dir [](start = 21, length = 10)

If there is any executable files inside rw, let's chmod a-x to change it to non executables.

However, user's home directory should keep as is. #Closed

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fixed.

Copy link
Collaborator

@qiluo-msft qiluo-msft left a comment

Choose a reason for hiding this comment

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

Add new comment

@qiluo-msft
Copy link
Collaborator

qiluo-msft commented Jun 9, 2020

change code and comment/title to use allowlist #Closed

@xumia xumia changed the title [secure boot] Support rw files whitelist [secure boot] Support rw files allowlist Jun 9, 2020
@xumia
Copy link
Collaborator Author

xumia commented Jun 9, 2020

Retest mellanox please

Copy link
Collaborator

@qiluo-msft qiluo-msft left a comment

Choose a reason for hiding this comment

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

Please also check with other reviewers.

@xumia
Copy link
Collaborator Author

xumia commented Jun 13, 2020

Retest mellanox please

@qiluo-msft qiluo-msft merged commit 76a395c into sonic-net:master Jun 13, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants