Java agent资料收集


=Start=

缘由:

最近在网上看到很多关于RASP相关的文章,想了解一下其背后的原理,所以收集整理一下看到的资料,方便以后参考。

正文:

参考解答:

JVM源码分析之javaagent原理完全解读
http://www.infoq.com/cn/articles/javaagent-illustrated
http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html
http://lovestblog.cn/blog/2014/06/18/jvm-attach/

Instrumentation 新功能
https://www.ibm.com/developerworks/cn/java/j-lo-jse61/index.html

java.lang.Instrument 代理Agent使用
http://www.importnew.com/22466.html
https://my.oschina.net/xianggao/blog/362495

javaagent
https://liuzhengyang.github.io/2017/03/15/javaagent/
https://github.com/liuzhengyang/javaagent-example

java.lang.instrument笔记
http://jiangbo.me/blog/2012/02/21/java-lang-instrument/

Java类动态加载(二)——动态加载class文件
http://zheng12tian.iteye.com/blog/1495037
http://zheng12tian.iteye.com/category/263312

https://stackoverflow.com/questions/27851588/what-is-premain-and-how-does-it-get-called
https://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html
https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html
https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html

premain和agentmain的优劣比较
https://stackoverflow.com/questions/19786078/what-is-the-use-of-agentmain-method-in-java-instrumentation
https://stackoverflow.com/questions/1277219/starting-a-java-agent-after-program-start
https://github.com/zakgrant/ASM-Examples/blob/master/src/main/java/name/zak/javaagent/JavaAgent.java

JavaSe:-javaagent,-agentlib,-agentpath
http://www.cnblogs.com/f1194361820/p/5059367.html

Java – Instrumentation
http://www.cnblogs.com/kavlez/p/4074660.html

AgentMain与VirtualMachine
http://blog.sina.com.cn/s/blog_605f5b4f01010i3b.html

JVM Attach API Introducation And Practice
https://afoo.me/posts/2010-11-25-jvm_attach_api_introduction_and_practice.html

http://itmyhome.com/java-api/java/lang/instrument/package-summary.html

Java agent笔记
http://www.yangguo.info/2015/07/18/JavaAgent%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%9D%E8%B7%AF/

Java Attach API
http://arganzheng.life/java-attach-api.html

云智慧透视宝Java代码性能监控实现原理
http://server.51cto.com/sManage-493660.htm

参考链接:

如上

=END=


《“Java agent资料收集”》 有 27 条评论

  1. Java agent笔记
    https://www.yangguo.info/2015/07/18/JavaAgent%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%9D%E8%B7%AF/
    `
    1、The Serviceability Agent(SA). Sun私有的一个组件,它可以帮助开发者调试Hotspot。
    2、jvmstat performance counters. HotSpot通过Sun私有的共享内存机制实现的性能计数器,它是公开给外部给外部进程的。它们也称为perfdata。
    3、The Java Virtual Machine Tool Interface (JVM TI). 它是一套标准的C接口,是 JSR 163 – JavaTM Platform Profiling Architecture 参考实现。JVMTI提供了可用于 debug和profiler的接口;同时,在Java 5/6 中,虚拟机接口也增加了监听(Monitoring),线程分析(Thread analysis)以及覆盖率分析(Coverage Analysis)等功能。JVMTI并不一定在所有的Java虚拟机上都有实现,不同的虚拟机的实现也不尽相同。不过在一些主流的虚拟机中,比如 Sun 和 IBM,以及一些开源的如 Apache Harmony DRLVM 中,都提供了标准 JVMTI 实现。
    4、The Monitoring and Management interface. Sun的私有实现,它能够实现对HotSpot的监控和管理。
    5、Dynamic Attach. Sun的私有机制,它允许外部进程在HotSpot中启动一个agent线程,该agent可以将该HotSPot的信息发送给外部进程。
    6、DTrace. 全称Dynamic Tracing,也称为动态跟踪,是由Sun™开发的一个用来在生产和试验性生产系统上找出系统瓶颈的工具,可以对内核(kernel)和用户应用程序(user application)进行动态跟踪并且对系统运行不构成任何危险的技术。在任何情况下它都不是一个调试工具,而是一个实时系统分析寻找出性能及其他问题的工具。DTrace是个特别好的分析工具,带有大量的帮助诊断系统问题的特性。还可以使用预先写好的脚本利用它的功能。用户也可以通过使用 DTrace D语言创建他们自己定制的分析工具,以满足特定的需求。除Solaris系列以外,Dtrace已先后被移植到FreeBSD、NetBSD及Max OS X等操作系统上。
    7、pstack support. pstack是从Solaris发源的实用程序,可以查看core dump文件,调试进程,查看线程运行情况等等。现在,pstack工具也移植到了Linux系统中,比如Red Hat Linux系统、Ubuntu Linux系统等等。HotSpot允许pstack显示Java堆栈帧。
    `

  2. 利用Java反射和类加载机制绕过JSP后门检测
    https://xz.aliyun.com/t/2342
    `
    0x00:前言
    0x01:Java执行系统命令的方法和原理
    0x02:JSP标签
    0x03:用ProcessBuilder绕过检测
    0x04:使用Java反射机制绕过检测
    一. 反射Runtime
    二. 反射ProcessBuilder
    三. 关于反射ProcessImpl

    0x05:使用Java类加载机制绕过检测
    Class对象
    Java自带的三个类加载器

    0x06:获得Class对象的四种方法
    0x07:后记
    参考链接
    `

  3. 入门科普,围绕JVM的各种外挂技术
    https://mp.weixin.qq.com/s/cwU2rLOuwock048rKBz3ew
    http://calvin1978.blogcn.com/articles/vjtools-tools4.html
    `
    jstat, jmap, btrace, jprofiler, vjtools都基于什么实现? 对围绕JVM的各种工具的外挂技术,运用大整理术,让大家从茫然,到轻摇纸扇,知道分子。

    归拢一下,就是C 和 Java两种Agent,SA 和 VirtualMachine 两种 Attach,JMX和PerfData两种Data。

    1. 两种Agent
    1.1 Native Agent
    以 C/C++代码编写的Agent,用强大的JVMTI(JVM Tool Interface)接口与JVM进行通讯,订阅感兴趣的JVM事件(比如方法出入、线程始末等等),当这些事件发生时,会回调Agent的代码。 JVMTI 同时提供了众多的功能函数,查询和控制 Java 应用的运行状态,包括内存控制和对象获取,线程与锁等等,简直无所不能。

    1.2 Java Agent
    Java Agent的底层也是JVMTI ,但后门能力就只剩一个AOP 代码植入了:在加载class文件之前做拦截并对字节码做修改。比如AspectJ,单元测试覆盖率的Jacoco,动态重载Class的Spring-Loaded。

    2.两种Attach
    两种截然不同方式实现的Attach,本质上都是在跟踪程序与目标JVM之间建立一个沟通的管道,然后在跟踪程序使用特定的API去操作目标JVM。

    2.1 Vitural Machine.attach()
    跟踪程序通过Unix Domain Socket 与目标JVM的Attach Listener线程进行交互。 Socket 文件为/tmp/.java_pid$PID。

    2.2 SA.attach()
    著名的SA(Serviceability Agent),用于分析JVM运行时进程的Snapshot数据。Snapshot的意思,就是当SA 开始分析时,整个目标JVM是停顿下来不工作的,让SA可以从容读取进程内存中的数据,直到断开后才会恢复。所以在生产上使用这类工具时,必须先摘除流量。
    这个神奇的操作,主要是通过系统调用ptrace实现。ptrace会使内核暂停目标进程并将控制权交给跟踪进程,使跟踪进程得以察看目标进程的内存,详见ptrace的man,所以在容器环境下,需要打开ptrace的安全权限。

    3. 两种Data
    3.1 JMX
    文章已太多,不再啰嗦。其中vjtools的vjtop,如何不停顿JVM的获得线程的CPU、内存信息,获得某条繁忙进程的StackTrace看看它在忙些什么,值得一看。

    3.2 PerfData
    很多人不知道的一个机制,JVM其实每秒都会将自己的大量统计数据,写入到 /tmp/hsperfdata_$username/$pid 文件中。
    `

  4. 【基本功】Java动态追踪技术探究
    https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA
    `
    【基本功】专栏又更新啦:想不重启JVM,偷天换日,替换掉已经加载的类?想不重启JVM,获知运行时对象的属性?本文将带你了解Java动态追踪技术的来龙去脉,还有依此衍生出的Java诊断神器……

    BTrace是基于Java语言的一个安全的、可提供动态追踪服务的工具。BTrace基于ASM、Java Attach API、Instrument开发,为用户提供了很多注解。依靠这些注解,我们可以编写BTrace脚本(简单的Java代码)达到我们想要的效果,而不必深陷于ASM对字节码的操作中不可自拔。

    Java的Instrument给运行时的动态追踪留下了希望,Attach API则给运行时动态追踪提供了“出入口”,ASM则大大方便了“人类”操作Java字节码的操作。

    基于Instrument和Attach API前辈们创造出了诸如JProfiler、Jvisualvm、BTrace这样的工具。以ASM为基础发展出了cglib、动态代理,继而是应用广泛的Spring AOP。

    Java是静态语言,运行时不允许改变数据结构。然而,Java 5引入Instrument,Java 6引入Attach API之后,事情开始变得不一样了。虽然存在诸多限制,然而,在前辈们的努力下,仅仅是利用预留的近似于“只读”的这一点点狭小的空间,仍然创造出了各种大放异彩的技术,极大地提高了软件开发人员定位问题的效率。
    `

  5. 浅谈 RASP 技术攻防之基础篇
    https://www.03sec.com/3237.shtml
    `
    引言
    一 、什么是 RASP?
    二、RASP vs WAF
    三、国外的 RASP
    四、国内 RASP 技术实现进度以及状态
    五、各种语言 RASP 技术实现方式
    1、JAVA
    2、PHP
    3、.NET
    4、other
    六、举个例子
    1. 如何在 Java 中实现 RASP 技术
    2. 如何在 PHP 中实现 RASP 技术
    七、RASP 技术的其他方面应用场景
    代码审计
    0day 防御
    攻击溯源
    DevOps
    其他方面
    八、RASP 技术有什么缺陷
    九、总结
    十、参考
    `

  6. 一文洞悉DAST、SAST、IAST ——Web应用安全测试技术对比浅谈
    https://mp.weixin.qq.com/s/EWn9ktce3KB4P6zi4slnTA
    `
    一、全球面临软件安全危机
    二、什么是Web应用安全测试技术?
    Web应用安全测试技术经过多年的发展,目前业界常用的技术主要分为3大类别。

    DAST:动态应用程序安全测试(Dynamic Application Security Testing)技术在测试或运行阶段分析应用程序的动态运行状态。它模拟黑客行为对应用程序进行动态攻击,分析应用程序的反应,从而确定该Web应用是否易受攻击。

    SAST:静态应用程序安全测试(Static Application Security Testing)技术通常在编码阶段分析应用程序的源代码或二进制文件的语法、结构、过程、接口等来发现程序代码存在的安全漏洞。

    IAST:交互式应用程序安全测试(Interactive Application Security Testing)是2012年Gartner公司提出的一种新的应用程序安全测试方案,通过代理、VPN或者在服务端部署Agent程序,收集、监控Web应用程序运行时函数执行、数据传输,并与扫描器端进行实时交互,高效、准确的识别安全缺陷及漏洞,同时可准确确定漏洞所在的代码文件、行数、函数及参数。IAST相当于是DAST和SAST结合的一种互相关联运行时安全检测技术。

    七、实际应用
    软件开发阶段,与程序员对话的源码安全审计主要基于SAST技术打造, SAST工具对用户的困扰主要来自于误报,通过数据流调用分析、变量关联分析、机器学习等多重手段极大地降低了误报率,减少工具对安全测试工作的困扰,改善用户体验,降低工具的使用成本。

    软件测试阶段,基于IAST技术打造,支持代理、VPN、流量信使、流量镜像、爬虫、导入日志、Passive插桩共7种流量收集模式,真正结合了DAST、SAST、IAST三种技术的优势;漏洞检测率极高,包括水平越权、垂直越权等标准IAST技术无法检测的逻辑漏洞,误报率几乎为0;漏洞详情直接定位请求、数据流、代码片段,修复漏洞更容易;采用Passive 插桩技术,无需重放请求,不会形成脏数据,可覆盖加密、防重放、签名等任意场景;近实时检测漏洞,漏洞检测随着应用程序运行实时进行。

    应用上线运营阶段,采用DAST技术打造资产风险监控系统,在大量企业客户中被用来对线上业务环境进行监控。从攻击者视角对企业进行资产探测,全面发现企业的资产暴露面和应用程序的漏洞,保障线上运营环境的安全;并且,部署模式紧跟业务的使用模式,支持在互联网环境、企业IDC、私有云、公有云、混合云等多种场景下部署使用。
    `

  7. Java神器–JMH & Arthas
    https://bryantchang.github.io/2019/12/08/java-profile-tools/
    `
    JMH 是一个面向 Java 语言或者其他 Java 虚拟机语言的性能基准测试框架

    # 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

    这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
    我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
    遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
    线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
    是否有一个全局视角来查看系统的运行状况?
    有什么办法可以监控到JVM的实时运行状态?
    怎么快速定位应用的热点,生成火焰图?

    Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
    `
    https://openjdk.java.net/projects/code-tools/jmh/

    Arthas 用户文档
    https://alibaba.github.io/arthas/

  8. RASP攻防 —— RASP安全应用与局限性浅析
    https://mp.weixin.qq.com/s/pjZDWG0YT9dxtNyO1g8ISw
    `
    随着Web应用攻击手段变得复杂,基于请求特征的防护手段,已经不能满足企业安全防护需求。在2012年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP,属于一种新型应用安全保护技术,它将防护功能“ 注入”到应用程序中,与应用程序融为一体,使应用程序具备自我防护能力,当应用程序遭受到实际攻击伤害时,能实时检测和阻断安全攻击,而不需要进行人工干预。

    腾讯洋葱反入侵团队早在很多年前就研究RASP的应用场景,2014年还在TSRC搞了一次基于rasp的webshell攻防挑战赛,详见(https://security.tencent.com/index.php/blog/msg/57);近几年从PHP逐步扩展到Java,Python,Nodejs等其他语言。RASP通过实时采集Web应用的高风险行为,通过特征规则、上下文语义分析及第三方安全产品数据关联分析等多种安全模型来提升检测准确率,相较于传统Web应用安全产品,RASP从海量的攻击中排除掉了大量的无效攻击,聚焦发现真实的已知和未知安全威胁。经过多年的实践我们发现RASP也存在一些缺陷和不足,本文以PHP RASP作为研究对象抛砖引玉,在此分享RASP的应用场景和问题。本文主要分三个部分:RASP架构原理简要介绍、RASP安全应用场景介绍 及 RASP对抗浅析。

    一、 RASP架构原理简要介绍
    TRASP 整个架构大致分为3个部分:1. 客户端模块;2. 云端数据分析模块;3. 安全处置模块。

    二、 RASP 安全应用场景介绍
    1. 基于规则的漏洞攻击检测
    2. 基于污点追踪的漏洞检测
    3. IAST扫描联动
    4. Webshell检测

    三、RASP 对抗浅析
    接下来从9个方面来阐述绕过方法,文中部分知识都是公开的,只是用在了新的场景。
    1. 函数监控不全
    2. 函数参数混淆
    3. loader型函数
    4. LD_PRELOAD
    5. htaccess和mod_cgi
    6. PHP-FPM
    7. C接口
    8. 已知漏洞
    9. GOT 表劫持

    四、总结

    单纯就RASP本身而言,RASP的优点在于能嵌入在应用程序内部,应用代码无感知,更了解应用程序上下文,方便定位漏洞信息,更少的误报和漏报,对各种绕过手法具有更强的防护能力;但缺点在于PHP RASP会对服务器的性能造成影响,推动部署落地相对困难。不过随着DevSecOps理念的推广,未来借助于云、容器等成熟的大规模基础设施和技术,通过优化完全有可能提供更优雅更易于接受和使用的部署方案,能够带来更快更精准更细致入微的安全检查及防护能力。关于DevSecOps理念与思考,大家可以参考我们团队之前的文章: “安全需要每个工程师的参与”-DevSecOps理念及思考 。

    虽然依然有一些对抗手段,但是RASP 在Web安全领域依然是现阶段强有力的存在。但是安全没有银弹,不存在一劳永逸的系统和办法,在漏洞/入侵检测上我们需要扫描器,WAF,IDS,EDR等系统的配合共建防御体系,纵深防御才是长久之道,并且需要持续研究在对抗中不断提升和发展。
    `
    文中涉及的文章pdf、代码、思维导图存放于
    https://github.com/qiyeboy/my_tsrc_paper
    仓库中,喜欢的朋友可以自取。

  9. RASP攻防中的矛与盾
    https://mp.weixin.qq.com/s/ObMxPKXUBNvhRtav0uJpWQ
    `
    # 引言
    随着第二期阿里云RASP挑战赛的圆满落幕,借此机会,我们今天想和大家聊一聊RASP攻防对抗的思路。

    # SQL语义分析攻防探索

    ## 防守方视角
    首先从“防”的视角而言,RASP不同于流量层检测产品,它能够通过Hook技术获取完整的执行的SQL语句,规避了传统流量层安全产品在语义分析上因为检测代码片段时造成的准确性问题,这也是RASP在语义分析上的技术实现上的一个巨大优势。

    **在拿到真实SQL语句和请求参数的前提下,__语义分析__需要做的事情便是判断用户输入是否导致了SQL语句发生了改变**,正常业务场景下的用户输入几乎不会改变SQL本身语义,因此**一旦SQL语义发生变化,那么无需依赖任何黑名单,RASP也能判断出当前的参数带有了“执行”的目的,而不是单纯的“数据”**

    ## 举例

    SELECT * FROM boy WHERE stuname = ‘data’

    当我们对该语句进行parameterize后就变成了

    SELECT * FROM boy WHERE stuname = ?

    而如果有用户输入了 data’ and ‘1’=’1,那么parameterize后的语句就变成了

    SELECT * FROM boy WHERE stuname = ? and ?=?

    那么其实即使该语句是不具备攻击性的,但是该输入使SQL语义发生了变化,无需依赖黑名单,基本就能判断该输入是一个SQL注入。**然而SQL语义分析的语法并不能很好的兼容所有类型的数据库,往往通过对数据库特性的研究,找出数据库和语义分析能力的差异性能力,触发了语义分析报错,找出绕过的方式**。那么从防御的角度来看,语义分析报错后的防护方案就显得非常重要。用户的输入直接导致了SQL语义报错本身其实已经是是否高危的行为,但往往考虑到业务环境的复杂性,需要结合词法分析和少量黑名单逻辑对该类场景进行二次确认,降低误报的可能性。

    类似的检测思路还有__词法分析__,也是被RASP经常使用的检测方式,原理层面更为简单,核心关注点就是用户输入前后SQL语句的token数是否发生了改变。

    ## 攻击方视角
    聊完了“防”的视角,那么再来谈谈“攻”的思路。首先我们知道语法分析是在词法分析的基础上分析Payload是否符合SQL语法规则。那问题来了,MySQL、MSSQL、Oracle和PostgreSQL等不同的数据库有着各自不同的语法特性, 开发者如果想全面覆盖不同的数据库需要很大的代价,往往会出现顾此失彼的现象。所以**尝试利用特性或者罕见语法知识就有可能绕过这一层面的检测逻辑**。

    不同的RASP在检测逻辑的实现上也存在着差异,例如有的会有多个检测逻辑的分支,当语义分析无法检测出payload时,可能就会面对强大的黑名单检测,而这一阶段就需要考验对数据库的深入理解和实时分析能力,当然还需要具备极强的耐心。

    # RCE攻防探索

    ## 防守方视角
    RCE漏洞的防护往往是RASP的优势检测场景。原因是在RCE场景下,RASP可以通过执行代码的入口,恶意行为出口等多个维度进行hook,从而形成一个纵深的防御体系,达到更高的防护效果。

    但毫无疑问,一旦执行代码的入口点被突破,那么防守者就势必面对“代码执行”与“恶意行为”(实际上远不止命令执行一种)之间存在灰色空间的问题,因此执行代码入口的覆盖广度才是RASP检测中最关键的点。

    ## 攻击方视角
    同样在聊完RCE场景的防御思路后,我们也聊聊“攻”的问题。很明确的事情是在RCE场景下,针对Java反序列化、命令执行的绕过非常困难,因为Java语言下,最终达到命令执行的方式无外乎JNDI注入、各种exec、远程类加载等,将已知的危险点都hook后,基本变得无懈可击。

    而通常的检测思路分为两类,一类是对表达式本身的语法进行的安全校验,让某些危险的类在表达式层面根本无法实例化,另一类是绕过表达式层校验后对命令执行等底层操作进行校验。首先达到命令执行的效果最直接的方式肯定是调用exec,但很明显这种方式在实际环境中很难突破检测。我们往往退而求其次,尝试寻找任意文件写入的方法,例如:可以写计划任务或者覆盖jar包达到RCE的效果。为了更高效更准确的找到目标类,我们可以使用CodeQL辅助发现。同时为了最大程度的避免表达式层面的检测,这里查找了公有静态方法中对文件写操作的调用

    在得到查询结果后,接着去**分析下源码,进行相应的代码构造,便有机会能够发现防御逻辑的漏网之鱼**;当然还有一些其它场景下的思路,比如:文件内容可控但文件名不可控的情况,对于这种情况可以考虑去搜索下类加载的调用,通过写入jar包后再进行类加载,那么可以通过ClassLoader来加载本地jar包的方法,尝试达到RCE的目的。

    # 总结
    随着0day的不断高频爆发,RASP这款产品开始走出当年的实验室产品的理论,一步一步走向安全人员视角。凭借云上的大量及复杂的业务场景,为阿里云RASP的稳定性提供了最佳实践,但基于RASP攻防相关的经验却很难依靠内部的一己之力实现大力的提升,尤其在RASP刚刚展露头角的今天,RASP攻防还未成为一个黑客们重点研究的课题,通过挑战赛中不断的攻防对抗积累为RASP提供攻防场景下的最佳实践具有巨大的意义。

    在这里再次感谢两届RASP挑战赛中的每一位参与的白帽子,尤其感谢两位白帽子:皓月和yemoli提供的攻击方视角分享。

    阿里云RASP挑战赛也会不断举行该类赛事,并发表相关内容,提升RASP攻防领域的交流与提升。
    `

回复 hi 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注