欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的RASP機(jī)制實(shí)現(xiàn)詳解

 更新時(shí)間:2019年08月29日 10:37:57   作者:Solinx  
這篇文章主要介紹了Java中的RASP實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

RSAP

RASP是Gartner公司提出的一個(gè)概念,稱:程序不應(yīng)該依賴于外部組件進(jìn)行運(yùn)行時(shí)保護(hù),而應(yīng)該自身?yè)碛羞\(yùn)行時(shí)環(huán)境保護(hù)機(jī)制;

RASP就是運(yùn)行時(shí)應(yīng)用自我保護(hù)(Runtime application self-protection)的縮寫,正如RASP字面意思一樣,這是運(yùn)行在運(yùn)行時(shí)的一種防護(hù)技能;也就是說RASP能夠在程序運(yùn)行期間實(shí)施自我保護(hù),監(jiān)控與過濾有害信息,還能夠擁結(jié)合程序的當(dāng)前上下文實(shí)施精確、實(shí)時(shí)的防護(hù);

Java中的RASP

不嚴(yán)格來說Java是半編譯、半解釋型語言,我們也都知道Java中也有運(yùn)行時(shí)(Runtime)那Java的運(yùn)行時(shí)在哪呢?

不急,我們先看看Java從編譯到運(yùn)行的流程圖;

上圖的流程為:Java編譯程序如Javac編譯.java源碼文件,生成Java字節(jié)碼文件.class,接著.class文件進(jìn)入JVM中解釋執(zhí)行; 從中我們可以看到Java的最后執(zhí)行階段是在JVM中,也就可以說Runtime運(yùn)行時(shí)是JVM的重要組成部分;除此之外我們還發(fā)現(xiàn)

Java中實(shí)現(xiàn)RASP的幾個(gè)關(guān)鍵點(diǎn):

1、 我們的防護(hù)程序必須能夠分析、修改java的.class文件;

2、 必須在JVM解釋執(zhí)行.class文件時(shí)進(jìn)行注入(Java Runtime);

通過上面的分析我們知道了要實(shí)現(xiàn)Java的RASP所要具備的能力,然后我們發(fā)現(xiàn)在Java中有Javassist、與ASM可以實(shí)現(xiàn)對(duì)Java字節(jié)碼的修改;有了修改.class字節(jié)碼文件的技能,還需要能夠在Java運(yùn)行期間注入我們的防護(hù)程序,通過上面我們發(fā)現(xiàn)Java運(yùn)行時(shí)是發(fā)生在JVM中,通過查找相關(guān)資料與JVM參數(shù)發(fā)現(xiàn)在JVM參數(shù)中有-javaagent參數(shù)配置Java代理可以在 運(yùn)行時(shí)注入我們的防護(hù)程序;

Java RASP實(shí)現(xiàn)

在上面的分析中我們發(fā)現(xiàn)只要在JVM的-javaagent參數(shù) 中配置我們的保護(hù)程序,就能夠輕松實(shí)現(xiàn)Java的RASP;

Java代理程序入口類需要有名為premain的靜態(tài)方法 ,還需要在jar的META-INF/MAINIFEST.MF文件中包含 Premain-Class配置,下面是RASP保護(hù)程序的入口類;

JavaRASPApp:

/**
 * @author linx
 * @date 2017-06-25
*/
public class JavaRASPApp {

 public static void premain(String agentArgs, Instrumentation instru) throws ClassNotFoundException, UnmodifiableClassException {
  System.out.println("premain");
  instru.addTransformer(new ClassTransformer());
 }
}

ClassTransformer類實(shí)現(xiàn)了Java的代理程序機(jī)制提供的ClassFileTransformer接口 ,能夠在運(yùn)行時(shí)(Runtime)對(duì)類的字節(jié)碼進(jìn)行替換與修改;

ClassTransformer也很簡(jiǎn)單,只有一個(gè)實(shí)現(xiàn)方法:transform,此方法中可以獲取得到ClassLoader、className、classfileBuffer等,分別為類加載器、類名、字節(jié)碼 ;

此時(shí)我們可以在transform方法中做文章,實(shí)現(xiàn)我們的防護(hù)程序;

/**
 * @author linxin
 * @version v1.0
 *     Copyright (c) 2017 by linx
 * @date 2017/6/23.
*/
 public class ClassTransformer implements ClassFileTransformer {
 public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){
  byte[] transformeredByteCode = classfileBuffer;
  try {

    if (className.equals("co/solinx/demo/Test")) {
      System.out.println(String.format("transform start %s",className));
      ClassReader reader = new ClassReader(classfileBuffer);
      ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
      ClassVisitor classVisitor = (ClassVisitor) createVisitorIns("co.solinx.demo.visitor.TestVisitor", writer, className);
      reader.accept(classVisitor, ClassReader.EXPAND_FRAMES);
      transformeredByteCode = writer.toByteArray(); 
    }
  } catch (Exception e) {
    e.printStackTrace();
  }catch (Throwable t){
    t.printStackTrace();
  }
  return transformeredByteCode;
}
 public Object createVisitorIns(final String name, ClassVisitor cv, String className)
    throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
  Constructor<?> ctor = Class.forName(name).getDeclaredConstructor(new Class[]{ClassVisitor.class, String.class});
  ctor.setAccessible(true);
  return ctor.newInstance(new Object[]{cv, className});
 }
}

可以看到我們?cè)趖ransform方法中co/solinx/demo/Test類進(jìn)行攔截,并通過ASM修改字節(jié)碼注入我們的保護(hù)邏輯,下面代碼是TestVisitorAdapter類中的onMethodEnter方法實(shí)現(xiàn)了通過ASM調(diào)用攔截器,拋出異常的字節(jié)碼;

@Override
protected void onMethodEnter() { 
  mv.visitTypeInsn(NEW,"co/solinx/demo/filter/SqlFilter");
  mv.visitInsn(DUP);
  mv.visitMethodInsn(INVOKESPECIAL,"co/solinx/demo/filter/SqlFilter","<init>","()V",false);
  mv.visitVarInsn(ASTORE,2);
  mv.visitVarInsn(ALOAD,2);
  mv.visitVarInsn(ALOAD,1);
  mv.visitMethodInsn(INVOKEVIRTUAL,"co/solinx/demo/filter/SqlFilter", "filter","(Ljava/lang/Object;)Z",false);
  Label label = new Label();
  /**
   * IFEQ filter返回值也就是棧頂int型數(shù)值等于true時(shí)跳轉(zhuǎn),拋出異常
   */
  mv.visitJumpInsn(IFEQ, label); 
  mv.visitTypeInsn(NEW, "java/sql/SQLException");
  mv.visitInsn(DUP);
  mv.visitLdcInsn("invalid sql because of security check");
  mv.visitMethodInsn(INVOKESPECIAL, "java/sql/SQLException", "<init>", "(Ljava/lang/String;)V", false);
  mv.visitInsn(ATHROW);
  mv.visitLabel(label);
  /**
   * 必須要調(diào)該方法,手動(dòng)設(shè)置Stack Map Table,否則會(huì)有 java.lang.VerifyError: Expecting a stackmap frame at branch target 26異常
   * 在jdk1.7中可以使用JVM參數(shù)-UseSplitVerifier,關(guān)掉class驗(yàn)證,但jdk1.8中該參數(shù)已經(jīng)去掉,所以要在1.8中運(yùn)行必須調(diào)用該方法;
   */
  mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
 } 

SqlFilter攔截類:

public class SqlFilter {
public boolean filter(Object sql){
  boolean ret=false;
  System.out.println(String.format("sql filter : %s ",sql));
  if(sql.toString().contains("1=1")){
    ret=true;
  }
  return ret;
}
}

TestVisitorAdapter類中的onMethodEnter方法中通過調(diào)用filter攔截器,返回true就是被攔截了,拋出異常,否則放行;至此一個(gè)簡(jiǎn)單的JAVA RASP demo就完成了; 通過后面的方式即可使用我們的RASP程序:java -javaagent:respjar-1.0-SNAPSHOT.jar app.jar;

通過RASP可以通過無嵌入、無需修改代碼的實(shí)現(xiàn)安全保護(hù),在RASP中可以攔截SQL、會(huì)話、有害請(qǐng)求、OGNL等等信息;

Demo源碼:https://github.com/linxin26/javarespdemo

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java反射機(jī)制最詳解

    java反射機(jī)制最詳解

    這篇文章主要介紹了Java 反射機(jī)制原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了Java反射機(jī)制的相關(guān)概念、原理、基本使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2021-08-08
  • JavaWeb導(dǎo)出Excel文件并彈出下載框

    JavaWeb導(dǎo)出Excel文件并彈出下載框

    這篇文章主要為大家詳細(xì)介紹了JavaWeb導(dǎo)出Excel文件并彈出下載框的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-06-06
  • SpringBoot 2 快速整合 Filter過程解析

    SpringBoot 2 快速整合 Filter過程解析

    這篇文章主要介紹了SpringBoot 2 快速整合 Filter過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java責(zé)任鏈設(shè)計(jì)模式實(shí)例分析

    Java責(zé)任鏈設(shè)計(jì)模式實(shí)例分析

    這篇文章主要介紹了Java責(zé)任鏈設(shè)計(jì)模式,結(jié)合實(shí)例形式詳細(xì)分析了Java責(zé)任鏈設(shè)計(jì)模式的原理與相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Spring中自動(dòng)注入的兩種方式總結(jié)

    Spring中自動(dòng)注入的兩種方式總結(jié)

    Spring的核心技術(shù)IOC(Intorol of Converse控制反轉(zhuǎn))的實(shí)現(xiàn)途徑是DI(dependency Insert依賴注入)。而依賴注入(DI)的實(shí)現(xiàn)方式又有兩種,xml方式和注解方式。本文就來詳細(xì)聊聊這兩個(gè)方式,需要的可以了解一下
    2022-10-10
  • Java文件管理操作的知識(shí)點(diǎn)整理

    Java文件管理操作的知識(shí)點(diǎn)整理

    這篇文章主要為大家詳細(xì)介紹了Java中文件管理操作的一些知識(shí)點(diǎn)和實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • 簡(jiǎn)單講解java中throws與throw的區(qū)別

    簡(jiǎn)單講解java中throws與throw的區(qū)別

    這篇文章主要介紹了簡(jiǎn)單講解java中throws與throw的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • ?Java數(shù)據(jù)結(jié)構(gòu)的十大排序

    ?Java數(shù)據(jù)結(jié)構(gòu)的十大排序

    這篇文章主要介紹了?Java數(shù)據(jù)結(jié)構(gòu)的十大排序,排序算法分為比較類排序和非比較類排序,具體的內(nèi)容,需要的朋友參考下面思維導(dǎo)圖及文章介紹,希望對(duì)你有所幫助
    2022-01-01
  • 詳解Spring Cloud 熔斷機(jī)制--斷路器

    詳解Spring Cloud 熔斷機(jī)制--斷路器

    這篇文章主要介紹了詳解Spring Cloud 熔斷機(jī)制--斷路器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java中的Comparable和Comparator接口

    Java中的Comparable和Comparator接口

    這篇文章主要介紹了Java中的Comparable和Comparator接口,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09

最新評(píng)論