simpleperf: Remove kernel ip addresses when not running as root
It is to avoid leaking KASLR info on user devices.
Bug: 390626125
Test: run simpleperf_unit_test
Change-Id: Id67e1cbcafcd0f6706774904a6339679f4a888e9
diff --git a/simpleperf/cmd_record.cpp b/simpleperf/cmd_record.cpp
index de4b857..3c46a98 100644
--- a/simpleperf/cmd_record.cpp
+++ b/simpleperf/cmd_record.cpp
@@ -592,6 +592,12 @@
// 3. Process options before opening perf event files.
exclude_kernel_callchain_ = event_selection_set_.ExcludeKernel();
+#if defined(__ANDROID__)
+ // Enforce removing kernel IP addresses to prevent KASLR disclosure.
+ if (!IsRoot()) {
+ exclude_kernel_callchain_ = true;
+ }
+#endif // defined(__ANDROID__)
if (trace_offcpu_ && !TraceOffCpu()) {
return false;
}
diff --git a/simpleperf/cmd_record_test.cpp b/simpleperf/cmd_record_test.cpp
index 924bbcf..062c868 100644
--- a/simpleperf/cmd_record_test.cpp
+++ b/simpleperf/cmd_record_test.cpp
@@ -732,7 +732,7 @@
// kernels. If it fails, please cherry pick below kernel patch:
// 02e184476eff8 perf/core: Force USER_DS when recording user stack data
OMIT_TEST_ON_NON_NATIVE_ABIS();
- TEST_REQUIRE_HOST_ROOT();
+ TEST_REQUIRE_ROOT();
TEST_REQUIRE_TRACEPOINT_EVENTS();
std::vector<std::unique_ptr<Workload>> workloads;
CreateProcesses(1, &workloads);
@@ -859,6 +859,18 @@
it = meta_info.find("app_type");
ASSERT_NE(it, meta_info.end());
ASSERT_EQ(it->second, app_type);
+
+ // Check that we are not leaking kernel ip addresses.
+ auto process_record = [](std::unique_ptr<Record> r) {
+ if (r->type() == PERF_RECORD_SAMPLE) {
+ const SampleRecord* sr = static_cast<const SampleRecord*>(r.get());
+ if (sr->InKernel()) {
+ return false;
+ }
+ }
+ return true;
+ };
+ ASSERT_TRUE(reader->ReadDataSection(process_record));
reader.reset(nullptr);
// Check that simpleperf can't execute child command in app uid.
diff --git a/simpleperf/record.cpp b/simpleperf/record.cpp
index 2685f37..5c704be 100644
--- a/simpleperf/record.cpp
+++ b/simpleperf/record.cpp
@@ -734,7 +734,7 @@
bool SampleRecord::ExcludeKernelCallChain() {
if (!(sample_type & PERF_SAMPLE_CALLCHAIN)) {
- return true;
+ return false;
}
size_t i;
for (i = 0; i < callchain_data.ip_nr; ++i) {
diff --git a/simpleperf/record_test.cpp b/simpleperf/record_test.cpp
index 9624dfd..e391cab 100644
--- a/simpleperf/record_test.cpp
+++ b/simpleperf/record_test.cpp
@@ -66,7 +66,7 @@
// @CddTest = 6.1/C-0-2
TEST_F(RecordTest, SampleRecord_exclude_kernel_callchain) {
SampleRecord r(event_attr, 0, 1, 0, 0, 0, 0, 0, {}, {}, {}, 0);
- ASSERT_TRUE(r.ExcludeKernelCallChain());
+ ASSERT_FALSE(r.ExcludeKernelCallChain());
event_attr.sample_type |= PERF_SAMPLE_CALLCHAIN;
SampleRecord r1(event_attr, 0, 1, 0, 0, 0, 0, 0, {}, {PERF_CONTEXT_USER, 2}, {}, 0);