如何解决 Java 安全问题,目前的应对策略都十分笨拙,往往适得其反。幸运的是,有一种新的方法可以将安全机制嵌入 Java 执行平台——或者更具体地说,嵌入 Java 虚拟机中,进而规避一些「Big Problem」。

保证 Java 应用的安全是一个艰巨的任务,在目前的软件开发领域,Java 程序员往往会从第三方库导入成千上万行代码。导入的代码常用于执行通用任务,如数据库访问、XML 处理、日志记录等。但是如果代码是开源的,没有人能保证其安全性或对其进行严格的渗透测试。因此,漏洞可以通过「导入代码」的后门入侵到内部系统。造成了企业对这些漏洞一无所知,攻击者却对它们了如指掌的现状。

当程序中出现缺陷代码时,攻击者可能在后端利用 SQL 注入等方式进行服务器攻击或数据访问。当然,开发者培训和静态软件分析工具都可以减少这类危险,但无法在应用进入生产环境后处理漏洞。因此,无需开发者干预的安全方法是更符合实际的选择。

由第三方库造成的漏洞典型当属2014年初的 Heartbleed 事件。简单地说,一个在 OpenSSL 加密库中发现的安全漏洞,影响了互联网上三分之二的 Web 服务器。虽然这个漏洞和 JAVA 无关,但依旧值得我们警醒。

传统 Java 防御

Java 应用的安全防护通常基于网络或测试,但这两种方法都不可靠。

首先是基于网络的防御措施包括Web应用防火墙和运行时入侵防御系统,可以为生产系统抵御外部威胁。为了避免阻塞合法的流量,这些系统必须进行微调以降低其有效性。否则,就得投入大量精力来调整,使之只允许合法流量通行。毕竟,如果授权的流量都被阻塞,真实用户也可能被拒之门外。也不得不说,网络级防御机制(如 IP 防火墙)阻塞流量时,终止网络连接的方法非常笨拙。

其次是应用测试工具会分析软件是否存在漏洞,其分析结果可能会让开发者大吃一惊,也可能数量非常庞大,让人难以区分哪些是关键问题、次要问题和误报。此外,如果漏洞侥幸入侵成功,这些工具在系统运行时根本无法起到保护作用。

新方法:带 RASP 的 JVM

目前,运行应用自我保护 RASP 是保护 Java 应用的新方法,在应用运行时结合应用行为(应用程序现在正在做什么)和实时情境进行实时分析。因此,持续的安全分析成为运行环境中的原生功能,系统能在识别攻击后即时响应。由于安全功能作用于程序内部,并且具备应用行为的指令意识,RASP 避免了其他防御方法常见的误报。

OneRASP 认为,实现 RASP 的最佳途径是充分利用 Java 虚拟机。JVM 是介于服务器操作系统和应用之间的完整运行环境,可以实时调整应用运行时的行为,且不需要修改应用代码。其次,因为 JVM 还控制着 Java 应用的全部 I / O,它可以阻塞未经授权的操作。最重要的是,它可以通过应用现有的错误处理程序,有效阻止任何入侵代码的执行。

RASP 的 OneRASP 是基于几乎所有主流的 JVM ,它添加了安全规则引擎来保护 Java 代码,且无需修改应用代码。规则引擎支持细粒度的监控,同时还控制所有的应用行为,包括文件和网络访问、类加载、反射、方法调用、SQL 查询、脚本功能等,能够自动地缓解攻击。

监督用户输入

在 JVM 中嵌入应用安全还意味着可以在程序执行过程中跟踪用户输入——即 「变量污点跟踪」功能,能够防止不受信任的用户输入导致的数据访问(如 SQL 查询)或未经验证的敏感操作(反射)。污点跟踪通过阻止恶意输入从不受信任的源传给信任源(例如从 HTTP 查询字符串到 SQL 数据库),实现对代码注入攻击(如 SQL 注入)的安全防御。

由于带 RASP 的 JVM 可以全面阻止恶意代码的执行,不论其来自应用内部、第三方库还是网络,因此战胜零日漏洞完全不在话下。此外,无需重启或中断服务,安全管理员就可以为运行的应用添加新规则,没有安全供应商的补丁也能即时阻止新发现的漏洞。

RASP 实例

Apache Struts 2 是一个用于开发 Java Web 应用的开源 Web 应用程序框架。在过去的几年中,我们发现了 Struts 框架中存在的诸多严重漏洞,攻击者可以借助这些漏洞对缺乏保护的服务器进行远程攻击。

为了修复这些漏洞,用户要么等待官方补丁(可能是几个星期或几个月),再对补丁进行测试和部署,要么重写代码,再重新测试和部署应用。

然而,有了 OneRASP 后,只需应用一条安全规则,无需重启或中断应用,在运行时就阻止入侵代码的执行。

众所周知,安全解决方案总免不了误报,对于关键任务型应用尤甚。RASP 能将此类风险降到最低。通过监测运行环境中的应用执行,能更细致地监测应用行为和上下文。这种方法比网络层检测更为精密;因此,实际部署前的性能调优与应用行为建模也更加简单。

最后,尽管没有哪种安全处理可以完全摆脱处理开销,但将安全操作嵌入 JVM 内,再由 JIT(Just-In-Time)编译器进行优化,可以确保最小化对性能的影响。与那些远程调用(如 REST API 调用)应用外部服务或「工具代理」将调试代码插入应用中的安全方法相比,本地「in-JVM」安全机制的性能优势可谓显而易见。

RASP 这种「由内而外」的保护方法有很多优势。将安全方法嵌入 JVM 内部,可以确保企业关键代码的可用性,同时最小化对性能的影响。这种方式还可以保护多个应用,无需要修改软件,比添加补丁更为快速灵活。

本文系 OneAPM工程师编译整理。如今,多样化的攻击手段层出不穷,传统安全解决方案越来越难以应对网络安全攻击。OneRASP 实时应用自我保护技术,可以为软件产品提供精准的实时保护,使其免受漏洞所累。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

如何解决 Java 安全问题?的更多相关文章

  1. java 22 - 12 多线程之解决线程安全问题的实现方式1

    从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...

  2. java线程安全问题以及使用synchronized解决线程安全问题的几种方式

    一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据 ...

  3. 浅谈利用同步机制解决Java中的线程安全问题

    我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...

  4. java并发之如何解决线程安全问题

    并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务. 而Java并发则由多线程实现的. 在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中.(当然这是比 ...

  5. Java之解决线程安全问题的方式三:Lock锁

    import java.util.concurrent.locks.ReentrantLock; /** * 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增 * * 1. 面试题:sy ...

  6. java 22 - 13 多线程之解决线程安全问题的实现方式2

    上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ;  Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...

  7. Lock锁方式解决线程安全问题

    在JDK5.0之后新增加了一种更强大的线程同步机制---通过显示定义同步锁来实现线程同步解决线程安全问题.同步锁使用Lock对象充当. java.util.concurrent.locks.lock接 ...

  8. Java 集合详解 | 一篇文章解决Java 三大集合

    更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...

  9. 静态同步方法和解决线程安全问题_Lock锁

    静态的同步方法锁对象是谁?不能是thisthis是创建对象之后产生的,静态方法优先于对象静态方法的锁对象是本类的cLass属性-->class文件对象(反射) 卖票案例出现了线程安全问题 卖出了 ...

随机推荐

  1. lua function

    This is the main reference for the World of Warcraft Lua Runtime. Note that these are mostly standar ...

  2. 关于js中return false、event.preventDefault()和event.stopPropagation()

    在平时项目中,如果遇到需要阻止浏览器默认行为,大家经常会用return false;和event.preventDefault()来阻止,但对它俩的区别还是有些一知半解,于是看了文档,查了些资料,在此 ...

  3. webrtc学习———记录三:mediaStreamTrack

    参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ...

  4. C# DbHelperSQLite,SQLite数据库帮助类 (转载)

    主要功能如下数据访问抽象基础类 主要是访问SQLite数据库主要实现如下功能 .数据访问基础类(基于SQLite),主要是用来访问SQLite数据库的. .得到最大值:是否存在:是否存在(基于SQLi ...

  5. hibernate 连接 oracle数据库

    前言:以下所有的操作都是基于你已经成功安装了oracle数据库并且java的开发环境正常的情况下进行的. 如果没有完善请先配置基础环境. 第一步:配置需要的环境(下载并导入需要的包). 我的百度云盘里 ...

  6. pl/sql编程

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  7. 一天学完UFLDL

    学习UFLDL笔记 第一节 神经网络 神经元长这样 大写W看着有点不习惯.. 激活函数, 就是上面式子中的f. 可以选 sigmoid函数(或者叫 logistic回归,对数几率函数),反正就是这样一 ...

  8. Binary Tree Level Order Traversal II 解题思路

    思路: 与Binary Tree Level Order Traversal I 几乎一样.只是最后将结果存放在栈里,然后在栈里再传给向量即可. 再次总结思路: 两个queue,先把第一个放进q1,循 ...

  9. gpfdist工具的初级使用

    gpfdist工具的使用主要两步: 第一步:打开gpfdist服务: gpfdist -d /home/admin -p -l /tmp/gpfdist.log & 参数解释: -d 数据文件 ...

  10. C#中class的访问级别

    中午吃饭前,同事问了一个问题:class 前面不加public访问修饰符时的默认访问级别是什么? 当时脑海自然而然的闪过了private 级别,但是细想感觉不对,class 是在namespace之下 ...