1d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/*
2d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * Copyright (C) 2016 The Android Open Source Project
3d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman *
4d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * Licensed under the Apache License, Version 2.0 (the "License");
5d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * you may not use this file except in compliance with the License.
6d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * You may obtain a copy of the License at
7d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman *
8d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman *      http://www.apache.org/licenses/LICENSE-2.0
9d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman *
10d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * Unless required by applicable law or agreed to in writing, software
11d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * distributed under the License is distributed on an "AS IS" BASIS,
12d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * See the License for the specific language governing permissions and
14d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * limitations under the License.
15d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman */
16d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
17d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#ifndef ASLR_TEST_H
18d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#define ASLR_TEST_H
19d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
20d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <cmath>
21d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <errno.h>
22d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <fstream>
23d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <iostream>
24d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <stdint.h>
25d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <string>
26d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <sys/wait.h>
27d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <unistd.h>
28d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <unordered_set>
29d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
30d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#include <gtest/gtest.h>
31d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
32d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#define MAX_ADDR_LEN 256
33d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
34d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#define PROCFS_PATH "/proc/sys/vm/mmap_rnd_bits"
35d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#define PROCFS_COMPAT_PATH "/proc/sys/vm/mmap_rnd_compat_bits"
36d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
37d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#define SCRAPE_PATH_64 "/data/nativetest64/scrape_mmap_addr/scrape_mmap_addr"
38d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#define SCRAPE_PATH_32 "/data/nativetest/scrape_mmap_addr/scrape_mmap_addr"
39d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#define SCRAPE_LIB_64 "/system/bin/linker64"
40d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#define SCRAPE_LIB_32 "/system/bin/linker"
41d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
42d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanclass AslrMmapTest : public ::testing::Test {
43d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman  protected:
44d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    static void SetUpTestCase();
45d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    static const char *path;
46d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    static const char *lib;
47d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    static unsigned int def, min, max;
48d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    static bool compat, user32;
49d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    static unsigned int def_cmpt, min_cmpt, max_cmpt;
50d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
51d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman    void TearDown();
52d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman};
53d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
54d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/*
55d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * gets the current mmap_rnd_bits value. requires root.
56d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman */
57d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanunsigned int get_mmap_rnd_bits(bool compat);
58d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
59d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/*
60d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * sets the corresponding mmap_rnd_bits variable, returns false if couldn't
61d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * change. requires root.
62d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman */
63d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanbool set_mmap_rnd_bits(unsigned int new_val, bool compat);
64d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
65d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/*
66d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * scrape_addr - get the raw starting address from /proc/child_pid/mmaps
67d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman */
68d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanstd::string scrape_addr(const char *exec_name, const char *lib_match);
69d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
70d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman/*
71d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * forks off sample_size processes and records the starting address of the
72d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * indicated library as reported by exec_name.  Reports entropy observed among
73d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman * recorded samples.
74d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman */
75d661642651a6689c76d3f575b4b5dbf04e6b75bddcashmanunsigned int calc_mmap_entropy(const char *exec_name, const char *lib_match, size_t samp_sz);
76d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman
77d661642651a6689c76d3f575b4b5dbf04e6b75bddcashman#endif //ASLR_TEST_H
78