From 2f113ad1e147fdf26e74e42ccf130184440dc4ea Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Mon, 22 Apr 2019 10:22:41 -0700 Subject: [PATCH] init: set up SelinuxAuditCallback() earlier The setup of SelinuxAuditCallback() was happening after property files are loaded, and now that these property files can trigger audits, the audit messages did not contain all of the correct information. This change moves the setup of SelinuxAuditCallback() to immediately before the property area is initialized, to ensure that this can not happen again. Bug: 130979265 Test: audits work early Change-Id: I9eb43269317c74e041626ee7b2bb7fea49250e09 --- init/property_service.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/init/property_service.cpp b/init/property_service.cpp index bf3b3172d..7d2f026b6 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -100,7 +100,24 @@ struct PropertyAuditData { const char* name; }; +static int PropertyAuditCallback(void* data, security_class_t /*cls*/, char* buf, size_t len) { + auto* d = reinterpret_cast(data); + + if (!d || !d->name || !d->cr) { + LOG(ERROR) << "AuditCallback invoked with null data arguments!"; + return 0; + } + + snprintf(buf, len, "property=%s pid=%d uid=%d gid=%d", d->name, d->cr->pid, d->cr->uid, + d->cr->gid); + return 0; +} + void property_init() { + selinux_callback cb; + cb.func_audit = PropertyAuditCallback; + selinux_set_callback(SELINUX_CB_AUDIT, cb); + mkdir("/dev/__properties__", S_IRWXU | S_IXGRP | S_IXOTH); CreateSerializedPropertyInfo(); if (__system_property_area_init()) { @@ -906,19 +923,6 @@ void property_load_boot_defaults(bool load_debug_prop) { update_sys_usb_config(); } -static int SelinuxAuditCallback(void* data, security_class_t /*cls*/, char* buf, size_t len) { - auto* d = reinterpret_cast(data); - - if (!d || !d->name || !d->cr) { - LOG(ERROR) << "AuditCallback invoked with null data arguments!"; - return 0; - } - - snprintf(buf, len, "property=%s pid=%d uid=%d gid=%d", d->name, d->cr->pid, d->cr->uid, - d->cr->gid); - return 0; -} - bool LoadPropertyInfoFromFile(const std::string& filename, std::vector* property_infos) { auto file_contents = std::string(); @@ -989,10 +993,6 @@ void CreateSerializedPropertyInfo() { } void StartPropertyService(Epoll* epoll) { - selinux_callback cb; - cb.func_audit = SelinuxAuditCallback; - selinux_set_callback(SELINUX_CB_AUDIT, cb); - property_set("ro.property_service.version", "2"); property_set_fd = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,