2017-12-21 03:51:15 +01:00
|
|
|
# Perfetto user-space tracing daemon (unprivileged)
|
2018-09-27 19:21:37 +02:00
|
|
|
type traced_exec, system_file_type, exec_type, file_type;
|
2017-12-21 03:51:15 +01:00
|
|
|
|
|
|
|
# Allow init to exec the daemon.
|
|
|
|
init_daemon_domain(traced)
|
2019-01-24 00:07:40 +01:00
|
|
|
tmpfs_domain(traced)
|
2017-12-21 03:51:15 +01:00
|
|
|
|
2018-02-21 14:44:39 +01:00
|
|
|
# Allow apps in other MLS contexts (for multi-user) to access
|
|
|
|
# share memory buffers created by traced.
|
|
|
|
typeattribute traced_tmpfs mlstrustedobject;
|
|
|
|
|
2017-12-21 03:51:15 +01:00
|
|
|
# Allow traced to start with a lower scheduling class and change
|
|
|
|
# class accordingly to what defined in the config provided by
|
|
|
|
# the privileged process that controls it.
|
|
|
|
allow traced self:global_capability_class_set { sys_nice };
|
|
|
|
|
2018-03-26 02:54:52 +02:00
|
|
|
# Allow to pass a file descriptor for the output trace from "perfetto" (the
|
|
|
|
# cmdline client) and other shell binaries to traced and let traced write
|
|
|
|
# directly into that (rather than returning the trace contents over the socket).
|
|
|
|
allow traced perfetto:fd use;
|
|
|
|
allow traced shell:fd use;
|
2019-01-21 19:54:45 +01:00
|
|
|
allow traced shell:fifo_file { read write };
|
2020-04-08 21:31:21 +02:00
|
|
|
|
|
|
|
# Allow the service to create new files within /data/misc/perfetto-traces.
|
|
|
|
allow traced perfetto_traces_data_file:file create_file_perms;
|
|
|
|
allow traced perfetto_traces_data_file:dir rw_dir_perms;
|
2019-01-23 21:42:16 +01:00
|
|
|
|
|
|
|
# Allow traceur to pass open file descriptors to traced, so traced can directly
|
|
|
|
# write into the output file without doing roundtrips over IPC.
|
|
|
|
allow traced traceur_app:fd use;
|
2019-01-10 21:17:40 +01:00
|
|
|
allow traced trace_data_file:file { read write };
|
2018-03-26 02:54:52 +02:00
|
|
|
|
2020-12-11 23:51:32 +01:00
|
|
|
# Allow perfetto to access the proxy service for notifying Traceur.
|
|
|
|
allow traced tracingproxy_service:service_manager find;
|
|
|
|
binder_use(traced);
|
|
|
|
binder_call(traced, system_server);
|
|
|
|
|
2020-02-04 14:44:14 +01:00
|
|
|
# Allow traced to use shared memory supplied by producers. Typically, traced
|
|
|
|
# (i.e. the tracing service) creates the shared memory used for data transfer
|
|
|
|
# from the producer. This rule allows an alternative scheme, where the producer
|
|
|
|
# creates the shared memory, that is then adopted by traced (after validating
|
|
|
|
# that it is appropriately sealed).
|
|
|
|
# This list has to replicate the tmpfs domains of all applicable domains that
|
|
|
|
# have perfetto_producer() macro applied to them.
|
|
|
|
# perfetto_tmpfs excluded as it should never need to use the producer-supplied
|
|
|
|
# shared memory scheme.
|
|
|
|
allow traced {
|
|
|
|
appdomain_tmpfs
|
|
|
|
heapprofd_tmpfs
|
|
|
|
surfaceflinger_tmpfs
|
|
|
|
traced_probes_tmpfs
|
|
|
|
userdebug_or_eng(`system_server_tmpfs')
|
|
|
|
}:file { getattr map read write };
|
|
|
|
|
2019-02-01 23:52:02 +01:00
|
|
|
# Allow traced to notify Traceur when a trace ends by setting the
|
|
|
|
# sys.trace.trace_end_signal property.
|
|
|
|
set_prop(traced, system_trace_prop)
|
2019-03-13 19:22:23 +01:00
|
|
|
# Allow to lazily start producers.
|
|
|
|
set_prop(traced, traced_lazy_prop)
|
2023-02-10 18:52:19 +01:00
|
|
|
# Allow tracking the count of sessions intercepting Java OutOfMemoryError
|
|
|
|
# If there are such tracing sessions and an OutOfMemoryError is thrown by ART,
|
|
|
|
# the hprof plugin intercepts the error, lazily registers a data source to
|
|
|
|
# traced and collects a heap dump.
|
|
|
|
set_prop(traced, traced_oome_heap_session_count_prop)
|
2019-02-01 23:52:02 +01:00
|
|
|
|
2020-12-16 19:45:31 +01:00
|
|
|
# Allow traced to talk to statsd for logging metrics.
|
|
|
|
unix_socket_send(traced, statsdw, statsd)
|
|
|
|
|
2017-12-21 03:51:15 +01:00
|
|
|
###
|
|
|
|
### Neverallow rules
|
|
|
|
###
|
|
|
|
### traced should NEVER do any of this
|
|
|
|
|
|
|
|
# Disallow mapping executable memory (execstack and exec are already disallowed
|
|
|
|
# globally in domain.te).
|
|
|
|
neverallow traced self:process execmem;
|
|
|
|
|
|
|
|
# Block device access.
|
|
|
|
neverallow traced dev_type:blk_file { read write };
|
|
|
|
|
|
|
|
# ptrace any other process
|
|
|
|
neverallow traced domain:process ptrace;
|
|
|
|
|
|
|
|
# Disallows access to /data files, still allowing to write to file descriptors
|
|
|
|
# passed through the socket.
|
2018-02-08 01:29:06 +01:00
|
|
|
neverallow traced {
|
|
|
|
data_file_type
|
2020-04-08 21:31:21 +02:00
|
|
|
-perfetto_traces_data_file
|
2018-02-08 01:29:06 +01:00
|
|
|
-system_data_file
|
2019-08-02 00:57:47 +02:00
|
|
|
-system_data_root_file
|
Restrict creating per-user encrypted directories
Creating a per-user encrypted directory such as /data/system_ce/0 and
the subdirectories in it too early has been a recurring bug. Typically,
individual services in system_server are to blame; system_server has
permission to create these directories, and it's easy to write
"mkdirs()" instead of "mkdir()". Such bugs are very bad, as they
prevent these directories from being encrypted, as encryption policies
can only be set on empty directories. Due to recent changes, a factory
reset is now forced in such cases, which helps detect these bugs;
however, it would be much better to prevent them in the first place.
This CL locks down the ability to create these directories to just vold
and init, or to just vold when possible. This is done by assigning new
types to the directories that contain these directories, and then only
allowing the needed domains to write to these parent directories. This
is similar to what https://r.android.com/1117297 did for /data itself.
Three new types are used instead of just one, since these directories
had three different types already (system_data_file, media_rw_data_file,
vendor_data_file), and this allows the policy to be a bit more precise.
A significant limitation is that /data/user/0 is currently being created
by init during early boot. Therefore, this CL doesn't help much for
/data/user/0, though it helps a lot for the other directories. As the
next step, I'll try to eliminate the /data/user/0 quirk. Anyway, this
CL is needed regardless of whether we're able to do that.
Test: Booted cuttlefish. Ran 'sm partition disk:253,32 private', then
created and deleted a user. Used 'ls -lZ' to check the relevant
SELinux labels on both internal and adoptable storage. Also did
similar tests on raven, with the addition of going through the
setup wizard and using an app that creates media files. No
relevant SELinux denials seen during any of this.
Bug: 156305599
Change-Id: I1fbdd180f56dd2fe4703763936f5850cef8ab0ba
2022-05-05 00:18:02 +02:00
|
|
|
-media_userdir_file
|
|
|
|
-system_userdir_file
|
|
|
|
-vendor_userdir_file
|
2018-02-08 01:29:06 +01:00
|
|
|
# TODO(b/72998741) Remove vendor_data_file exemption. Further restricted in a
|
|
|
|
# subsequent neverallow. Currently only getattr and search are allowed.
|
|
|
|
-vendor_data_file
|
2019-06-14 00:05:15 +02:00
|
|
|
with_native_coverage(`-method_trace_data_file')
|
2018-02-08 01:29:06 +01:00
|
|
|
}:dir *;
|
|
|
|
neverallow traced { system_data_file }:dir ~{ getattr search };
|
2018-03-26 02:54:52 +02:00
|
|
|
neverallow traced {
|
|
|
|
data_file_type
|
|
|
|
-perfetto_traces_data_file
|
2019-01-10 21:17:40 +01:00
|
|
|
-trace_data_file
|
2019-06-14 00:05:15 +02:00
|
|
|
with_native_coverage(`-method_trace_data_file')
|
2018-03-26 02:54:52 +02:00
|
|
|
}:file ~write;
|
2017-12-21 03:51:15 +01:00
|
|
|
|
|
|
|
# Only init is allowed to enter the traced domain via exec()
|
|
|
|
neverallow { domain -init } traced:process transition;
|
|
|
|
neverallow * traced:process dyntransition;
|
2021-06-24 01:53:45 +02:00
|
|
|
|
|
|
|
# Limit the processes that can access tracingproxy_service.
|
2021-12-10 22:50:44 +01:00
|
|
|
neverallow {
|
|
|
|
domain
|
|
|
|
-traced
|
|
|
|
-dumpstate
|
|
|
|
-traceur_app
|
|
|
|
-shell
|
|
|
|
-system_server
|
|
|
|
-perfetto
|
|
|
|
} tracingproxy_service:service_manager find;
|