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