From 397b07b38f10810293d80b4dbdac32e857f725d6 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn <salyzyn@google.com> Date: Wed, 13 Sep 2017 14:01:25 -0700 Subject: [PATCH] bootstat: lock down *_boot_reason_prop Add series of neverallow rules to restrict components from reading or writing bootloader_boot_reason_prop, system_boot_reason_prop and last_boot_reason_prop to trusted set of domains. The policy is that bootloader_boot_reason_prop (ro.boot.bootreason) has a compliance issue due to the sheer momentum of near unparseable content as filed by the wide variety (8000 different devices at last count) bootloaders and is only to be accessible to a series of responsible system components. It can be inaccurate as it provides no means to evaluate a shutdown, likely reporting "cold" (from initial power up) or the more generic "reboot". The last_boot_reason_prop (persist.sys.boot.reason) contains inaccurate information as it is only valid after a controlled reboot or shutdown. The value can linger around after less controlled scenarios. Since the information could be false, we do not want to support it as an open API, so we again block access to only responsible components. The system_boot_reason_prop (sys.boot.reason) is a canonical boot reason that takes into account parsing bootloader_boot_reason_prop, boot_loader_boot_reason_prop and other system and HAL generated hints to determine a parseable and most accurate reason for the last time the system was rebooted. For now the policy for system_boot_reason_prop is to audit users of the API, and on a need to know basis via device additions to the selinux rules. If vendors need their components to access the boot reason, they need to comply first with CTS tests and spirit with regards to controlled reboot messaging and in turn read the system_boot_reason_prop for the canonical information. It will contain validated content derived from bootloader_boot_reason_prop in the scenarios that count. The controlled reboot APIs include: - android_reboot(ANDROID_RB_<TYPE>, int flag, const char* reason) - PowerManagerService.lowLevelShutdown(String reason); - PowerManagerService.lowLevelReboot(String reason); - ShutdownThread.shutdown(context, String reason, boolean confirm); - ShutdownThread.reboot(context, String reason, boolean confirm); - PowerManager.shutdown(boolean confirm, String reason, boolean wait); - PowerManager.reboot(String reason); Any others (including the direct linux reboot syscall) create problems for generating an accurate canonical boot reason. Test: compile Bug: 63736262 Bug: 65686279 Change-Id: I2e5e55bbea1c383c06472eb2989237cfeb852030 --- public/bootstat.te | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/public/bootstat.te b/public/bootstat.te index b3cca401d..a55cfe6a4 100644 --- a/public/bootstat.te +++ b/public/bootstat.te @@ -30,3 +30,31 @@ allow bootstat kernel:system syslog_read; read_logd(bootstat) # ToDo: end + +neverallow { + domain + -bootanim + -bootstat + -dumpstate + -init + -recovery + -shell + -system_server +} { bootloader_boot_reason_prop last_boot_reason_prop }:file r_file_perms; +# ... and refine, as these components should not set the last boot reason +neverallow { bootanim recovery } last_boot_reason_prop:file r_file_perms; + +neverallow { + domain + -bootstat + -init + -system_server +} { bootloader_boot_reason_prop last_boot_reason_prop }:property_service set; +# ... and refine ... for a ro propertly no less ... keep this _tight_ +neverallow system_server bootloader_boot_reason_prop:property_service set; + +neverallow { + domain + -bootstat + -init +} system_boot_reason_prop:property_service set; -- GitLab