欢迎访问本站!

首页科技正文

电银付app下载(dianyinzhifu.com):基于AFL对Linux内核模糊测试的历程详述

admin2020-12-22112内网渗透

coverage-guided fuzzing是一种壮大的模糊测试手艺,由于代码笼罩率(Code Coverage)是反映测试用例对被测软件笼罩程序的主要指标,自动化程序将半随机输入注入到测试程序中,这样做的目的是找到触发破绽的输入,模糊测试在查找C或c++程序中的内存损坏破绽时稀奇有用。通常情况下,建议选择一个异常熟悉但很少涉及的、大量剖析的库。依据经验看,libjpeg、libpng和libyaml都是完善的攻击目的。不外现在很难找到一个好的目的,不外从另外一个角度来说,这也说明软件越来越平安了!不外我照样决议实验一下Linux内核的netlink机制。

Netlink是linux提供的用于内核和用户态历程之间的通讯方式。然则注重虽然Netlink主要用于用户空间和内核空间的通讯,然则也能用于用户空间的两个历程通讯。只是历程间通讯有其他许多方式,一样平常不用Netlink。除非需要用到Netlink的广播特征时。

从原理上来说,Netlink是供“ ss”,“ ip”,“ netstat”之类的工具使用的内部Linux工具。它用于低层 *** 义务——设置 *** 接口、IP地址、路由表等。以是,这是一个很好的渗透测试目的,由于它是内核中一个不为人知的部门,而且自动编写有用的新闻相对容易。最主要的是,在这个历程中我们可以学到许多关于Linux内部的器械。不外,netlink中的破绽不会对平安造成影响,由于netlink套接字通常需要特权接见。

在这篇文章中,我们将运行AFL代码笼罩率工具,在一个定制的Linux内核上驱动我们的netlink shim程序,所有这些都在KVM虚拟化中运行。

通常,在使用AFL时,我们需要检测目的代码,以便以AFL兼容的方式讲述代码笼罩率。然则我们想要模糊内核!我们不能只是用“afl-gcc(AFL的编译器)”重新编译它。相反,我们将使用一个技巧。我们将准备一个二进制文件,它会诱骗AFL,让它认为是用它的工具编译的。这个二进制文件将讲述从内核中提取的代码笼罩率。

内核代码的代码笼罩率

内核至少有两个内置的代码笼罩率机制- GCOV和KCOV:

1. 在Linux内核中使用gcov;

2. KCOV:模糊的代码笼罩率。

KCOV在设计时思量到了模糊性测试,因此我们将使用它。

Kcov是一个代码笼罩测试工具,最初基于Bcov,它可在FreeBSD、Linux、OSX系统中使用,支持的语言包罗编译语言(compiled languages)、Python和Bash。与Bcov一样,Kcov对编译的程序使用DWARF调试信息,以便无需特殊编译器开关即可 *** 笼罩信息。

KCOV使用起来异常简朴,我们必须使用准确的设置来编译Linux内核。首先,启用KCOV内核设置选项:

cd linux
./scripts/config \
    -e KCOV \
    -d KCOV_INSTRUMENT_ALL

KCOV能够纪录整个内核的代码笼罩率,可以使用KCOV_INSTRUMENT_ALL选项举行设置。然则,这样做也有瑕玷,会减慢我们不想剖析的内核部门,而且会在我们的丈量中引入噪音降低丈量的准确性。首先,让我们禁用KCOV_INSTRUMENT_ALL并有选择地在我们现实要剖析的代码上启用KCOV。在这篇文章中,我们只关注netlink机制,因此我们会在整个“ net”目录树上启用KCOV:

find net -name Makefile | xargs -L1 -I {} bash -c 'echo "KCOV_INSTRUMENT := y" >> {}'

在理想的情况下,我们只对我们真正感兴趣的几个文件启用KCOV。然则netlink处置普及整个 *** 客栈代码,因此我们在这篇文章中没有时间对其举行微调。

使用KCOV后,就有需要添加“内核黑客”选项,以增添讲述内存损坏破绽的可能性。关于Syzkaller建议的选项列表,请参阅自述,其中最主要的是KASAN。

有了这个设置,我们就可以编译启用KCOV和KASAN的内核。哦,另有一件事,我们将在kvm中运行内核。我们将使用“virtme”,以是我们需要一些切换:

./scripts/config \
    -e VIRTIO -e VIRTIO_PCI -e NET_9P -e NET_9P_VIRTIO -e 9P_FS \
    -e VIRTIO_NET -e VIRTIO_CONSOLE  -e DEVTMPFS ...

若何使用KCOV

KCOV异常容易使用,首先,请注重,代码笼罩率纪录在每个历程的数据结构中。这意味着你必须在用户空间历程中启用和禁用KCOV,而且不可能纪录诸如中止处置之类的非义务内容的笼罩局限,这完全符合我们的需要。

KCOV将数据讲述到一个环形缓冲区,设置异常简朴,详细请参阅此代码,然后,你可以使用简朴的ioctl启用和禁用它。

ioctl(kcov_fd, KCOV_ENABLE, KCOV_TRACE_PC);
/* profiled code */
ioctl(kcov_fd, KCOV_DISABLE, 0);

在这个序列之后,循环缓冲区包罗所有启用kcov的内核代码的基本块的%rip值的列表。要读取缓冲区,只需运行以下代码即可:

n = __atomic_load_n(&kcov_ring[0], __ATOMIC_RELAXED);
for (i = 0; i < n; i++) {
    printf("0x%lx\n", kcov_ring[i + 1]);
}

使用addr2line这样的工具,可以将%rip剖析为特定的代码行。虽然我们不需要它,原始的%rip值对我们来说已经足够了。

将KCOV注入AFL

下一步是学习若何诱骗AFL,请记着,AFL需要一个专门设计的可执行文件,然则我们希望提供内核代码笼罩率。首先,我们需要领会AFL是若何事情的。

AFL设置一个64K的8位数字数组,这个内存区域称为“shared_mem”或“trace_bits”,与跟踪程序共享。可以将数组中的每个字节看作插装代码中特定(branch_src、branch_dst)对的掷中计数器。

需要注重的是,AFL更喜欢使用随机的分支标签,而不是重用%rip值来标识基本块。这是为了增添熵,我们希望数组中的掷中计数器是均匀分布的。AFL使用的算法为:

cur_location = <COMPILE_TIME_RANDOM>;
shared_mem[cur_location ^ prev_location]++; 
prev_location = cur_location >> 1;

在使用KCOV的情况下,我们没有为每个分支提供编译时随机值。相反,我们将使用哈希函数从KCOV纪录的%rip天生统一的16位数字。这是将KCOV讲述送入AFL“shared_mem”数组的方式:

n = __atomic_load_n(&kcov_ring[0], __ATOMIC_RELAXED);
uint16_t prev_location = 0;
for (i = 0; i < n; i++) {
        uint16_t cur_location = hash_function(kcov_ring[i + 1]);
        shared_mem[cur_location ^ prev_location]++;
        prev_location = cur_location >> 1;
}

从AFL读取测试数据

,

usdt跑分平台

菜包钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜包Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

最后,我们需要现实编写测试代码来攻击内核netlink接口!首先,我们需要从AFL读取输入数据。默认情况下,AFL将测试用例发送到stdin:

/* read AFL test data */
char buf[512*1024];
int buf_len = read(0, buf, sizeof(buf));

Netlink的模糊测试

然后我们需要将这个缓冲区发送到一个netlink套接字。然则我们对netlink的事情原理一无所知!好的,让我们使用前5个字节的输入作为netlink协媾和组id字段。这将允许AFL盘算并预测这些字段的准确值。代码测试netlink(简化):

struct sockaddr_nl sa = {
        .nl_family = AF_NETLINK,
        .nl_groups = (buf[1] <<24) | (buf[2]<<16) | (buf[3]<<8) | buf[4],
};

bind(netlink_fd, (struct sockaddr *) &sa, sizeof(sa));

struct iovec iov = { &buf[5], buf_len - 5 };
struct sockaddr_nl sax = {
      .nl_family = AF_NETLINK,
};

struct msghdr msg = { &sax, sizeof(sax), &iov, 1, NULL, 0, 0 };
r = sendmsg(netlink_fd, &msg, 0);
if (r != -1) {
      /* sendmsg succeeded! great I guess... */
}

基本上就是这样!为了提高速率,我们将其包装在一个简短的循环中,该循环模拟AFL的“fork服务器”逻辑。我将在此处跳过说明,有关详细信息,请参见我们的代码。我们的AFL-to-KCOV shim的效果代码如下:

forksrv_welcome();
while(1) {
    forksrv_cycle();
    test_data = afl_read_input();
    kcov_enable();
    /* netlink magic */
    kcov_disable();
    /* fill in shared_map with tuples recorded by kcov */
    if (new_crash_in_dmesg) {
         forksrv_status(1);
    } else {
         forksrv_status(0);
    }
}

点此,参见完整的源代码。

若何运行自定义内核

现在来说说,若何现实运行我们构建的自定义内核,现在共有三个选项:

“内陆”选项:你可以完全在你的服务器上启动构建的内核,并在内陆对其举行模糊处置。这是最快的手艺,然则问题许多。若是模糊测试成功地找到了一个破绽,你的装备很可能会溃逃,从而丢失测试数据。 

“uml” :我们可以将内核设置为以用户模式Linux运行,运行UML内核不需要任何特权。内核只运行一个用户空间历程。UML异常酷,但遗憾的是,它不支持KASAN,因此发现内存损坏破绽的机遇减少了。最后,UML是一个异常神奇的特殊环境,在UML中发现的破绽可能与现实环境无关。有趣的是,Android network_tests框架使用了UML。

 “kvm”:我们可以使用kvm在虚拟环境中运行自定义内核。

在KVM环境中运行自定义内核的最简朴方式之一是使用“virtme”剧本。有了它们,我们就不必确立专用的磁盘映像或分区,只需共享主机文件系统。以下是我们运行代码的方式:

virtme-run \
    --kimg bzImage \
    --rw --pwd --memory 512M \
    --script-sh "<what to run inside kvm>"

不外要害的一步似乎忘了,就是为我们的模糊器准备输入语料库数据!

确立输入语料库

每个模糊测试都采用了一个精心设计的测试用例作为输入,以指导第一个突变。测试用例应该是简短的,并笼罩尽可能多的代码。遗憾的是,我对netlink一无所知。

于是,我就让AFL“找出”哪些输入是有意义的,以下就是我们的输入语料库:

mkdir inp
echo "hello world" > inp/01.txt

编译和运行整个程序的历程,请参见github上的README.md ,简朴来说,如下所示:

virtme-run \
    --kimg bzImage \
    --rw --pwd --memory 512M \
    --script-sh "./afl-fuzz -i inp -o out -- fuzznetlink"

运行此下令,你将看到熟悉的AFL状态屏幕:

电银付app下载(dianyinzhifu.com):基于AFL对Linux内核模糊测试的历程详述 内网渗透 第1张

现在,你就有了一个自定义的强化内核,该内核会运行一个以代码笼罩率为测试标识的模糊测试历程。

这样的起劲值得吗?纵然有了这个基本的模糊测试器,也没有输入语料库。不在两三天后,该模糊器照样找到了一条有趣的代码路径:NEIGH:BUG,双计时器加法,状态为8。使用更专业的模糊器,可以举行一些改善“稳固性”的事情指标和像样的输入语料库,我们可以期待更好的测试效果。

若是你想领会更多有关netlink套接字现实功效的信息,请参阅此文。

不外在这篇文章中,我们没有提到:

1. 详细的AFL shared_memory设置;

2. AFL的持久模式是若何实现的;

3. 若何确立一个 *** 名称空间来隔离新鲜的netlink下令的影响,并提高AFL的“稳固性”;

4. 若何读取dmesg (/dev/kmsg) 来查找内核溃逃;

5. 在KVM之外运行AFL的想法,为了速率和稳固性,现在的测试在发现溃逃后还不稳固。

网友评论

1条评论
  • 2021-01-09 00:16:03

    位居第三的是步行者的布罗格登+奥拉迪波+沃伦+小萨博尼斯+特纳,这套阵容进攻效率119.4,防守效率92.7,百回合赢26.6分。和篮网一样,步行者现在的这套阵容也由于伤病用不上了,沃伦左脚应力性骨折,将无限期休战。没仔细看,再来一遍