trusty: Fuzzer for ConfirmationUI messages
ConfirmationUI messages are a higher-level abstraction than TIPC messages (which is what TIPC fuzzer fuzzes). Bug: 174402999 Test: trusty_confirmationui_msg_fuzzer Change-Id: I1e1e2c7070b87b78d6236993330df65202840ce6
This commit is contained in:
parent
fcfa3cd9b5
commit
5ff073e832
|
@ -27,3 +27,17 @@ cc_fuzz {
|
|||
],
|
||||
|
||||
}
|
||||
|
||||
cc_fuzz {
|
||||
name: "trusty_confirmationui_msg_fuzzer",
|
||||
defaults: ["trusty_fuzzer_defaults"],
|
||||
srcs: ["msg_fuzzer.cpp"],
|
||||
include_dirs: ["system/core/trusty/confirmationui/include"],
|
||||
shared_libs: [
|
||||
"libdmabufheap",
|
||||
],
|
||||
|
||||
// The initial corpus for this fuzzer was derived by dumping messages from/to
|
||||
// HAL to/from TA triggered by VtsHalConfirmationUIV1_0TargetTest.
|
||||
corpus: ["msg_corpus/*"],
|
||||
}
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
* Copyright (C) 2021 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <BufferAllocator/BufferAllocator.h>
|
||||
#include <TrustyIpc.h>
|
||||
#include <iostream>
|
||||
#include <stdlib.h>
|
||||
#include <sys/mman.h>
|
||||
#include <time.h>
|
||||
#include <trusty/coverage/coverage.h>
|
||||
#include <trusty/fuzz/counters.h>
|
||||
#include <trusty/fuzz/utils.h>
|
||||
#include <trusty/tipc.h>
|
||||
#include <unistd.h>
|
||||
|
||||
using android::trusty::coverage::CoverageRecord;
|
||||
using android::trusty::fuzz::ExtraCounters;
|
||||
using android::trusty::fuzz::TrustyApp;
|
||||
|
||||
#define countof(arr) (sizeof(arr) / sizeof(arr[0]))
|
||||
|
||||
#define TIPC_DEV "/dev/trusty-ipc-dev0"
|
||||
#define CONFIRMATIONUI_PORT "com.android.trusty.confirmationui"
|
||||
#define CONFIRMATIONUI_MODULE_NAME "confirmationui.syms.elf"
|
||||
|
||||
/* A request to render to screen may take a while. */
|
||||
const size_t kTimeoutSeconds = 30;
|
||||
|
||||
/* ConfirmationUI TA's UUID is 7dee2364-c036-425b-b086-df0f6c233c1b */
|
||||
static struct uuid confirmationui_uuid = {
|
||||
0x7dee2364,
|
||||
0xc036,
|
||||
0x425b,
|
||||
{0xb0, 0x86, 0xdf, 0x0f, 0x6c, 0x23, 0x3c, 0x1b},
|
||||
};
|
||||
|
||||
static CoverageRecord record(TIPC_DEV, &confirmationui_uuid, CONFIRMATIONUI_MODULE_NAME);
|
||||
|
||||
static android::base::unique_fd dma_buf;
|
||||
static void* shm_base;
|
||||
|
||||
extern "C" int LLVMFuzzerInitialize(int* /* argc */, char*** /* argv */) {
|
||||
auto ret = record.Open();
|
||||
if (!ret.ok()) {
|
||||
std::cerr << ret.error() << std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
BufferAllocator allocator;
|
||||
dma_buf.reset(allocator.Alloc(kDmabufSystemHeapName, CONFIRMATIONUI_MAX_MSG_SIZE));
|
||||
if (dma_buf < 0) {
|
||||
std::cerr << "Failed to allocate dma_buf" << std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
shm_base = mmap(0, CONFIRMATIONUI_MAX_MSG_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf, 0);
|
||||
if (shm_base == MAP_FAILED) {
|
||||
std::cerr << "Failed to mmap() dma_buf" << std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool Init(int chan, int dma_buf) {
|
||||
confirmationui_hdr hdr = {
|
||||
.cmd = CONFIRMATIONUI_CMD_INIT,
|
||||
};
|
||||
confirmationui_init_req args = {
|
||||
.shm_len = CONFIRMATIONUI_MAX_MSG_SIZE,
|
||||
};
|
||||
iovec iov[] = {
|
||||
{
|
||||
.iov_base = &hdr,
|
||||
.iov_len = sizeof(hdr),
|
||||
},
|
||||
{
|
||||
.iov_base = &args,
|
||||
.iov_len = sizeof(args),
|
||||
},
|
||||
};
|
||||
trusty_shm shm = {
|
||||
.fd = dma_buf,
|
||||
.transfer = TRUSTY_SHARE,
|
||||
};
|
||||
|
||||
int rc = tipc_send(chan, iov, countof(iov), &shm, 1);
|
||||
if (rc != static_cast<int>(sizeof(hdr) + sizeof(args))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
rc = read(chan, &hdr, sizeof(hdr));
|
||||
if (rc != static_cast<int>(sizeof(hdr))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool Msg(int chan, const uint8_t* data, size_t size) {
|
||||
confirmationui_hdr hdr = {
|
||||
.cmd = CONFIRMATIONUI_CMD_MSG,
|
||||
};
|
||||
confirmationui_msg_args args = {
|
||||
.msg_len = static_cast<uint32_t>(size),
|
||||
};
|
||||
iovec iov[] = {
|
||||
{
|
||||
.iov_base = &hdr,
|
||||
.iov_len = sizeof(hdr),
|
||||
},
|
||||
{
|
||||
.iov_base = &args,
|
||||
.iov_len = sizeof(args),
|
||||
},
|
||||
};
|
||||
|
||||
memset(shm_base, 0, CONFIRMATIONUI_MAX_MSG_SIZE);
|
||||
memcpy(shm_base, data, size);
|
||||
|
||||
int rc = tipc_send(chan, iov, countof(iov), NULL, 0);
|
||||
if (rc != static_cast<int>(sizeof(hdr) + sizeof(args))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
rc = readv(chan, iov, countof(iov));
|
||||
if (rc != static_cast<int>(sizeof(hdr) + sizeof(args))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
||||
ExtraCounters counters(&record);
|
||||
counters.Reset();
|
||||
|
||||
TrustyApp ta(TIPC_DEV, CONFIRMATIONUI_PORT);
|
||||
auto ret = ta.Connect();
|
||||
if (!ret.ok()) {
|
||||
android::trusty::fuzz::Abort();
|
||||
}
|
||||
int chan = *ta.GetRawFd();
|
||||
|
||||
alarm(kTimeoutSeconds);
|
||||
bool success = Init(chan, dma_buf);
|
||||
alarm(0);
|
||||
if (!success) {
|
||||
android::trusty::fuzz::Abort();
|
||||
}
|
||||
|
||||
alarm(kTimeoutSeconds);
|
||||
success = Msg(chan, data, size);
|
||||
alarm(0);
|
||||
if (!success) {
|
||||
android::trusty::fuzz::Abort();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue