如何解决 Java 安全问题?

如何解决 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 安全问题?的更多相关文章
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- java线程安全问题以及使用synchronized解决线程安全问题的几种方式
一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据 ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
- java并发之如何解决线程安全问题
并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务. 而Java并发则由多线程实现的. 在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中.(当然这是比 ...
- Java之解决线程安全问题的方式三:Lock锁
import java.util.concurrent.locks.ReentrantLock; /** * 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增 * * 1. 面试题:sy ...
- java 22 - 13 多线程之解决线程安全问题的实现方式2
上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ; Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...
- Lock锁方式解决线程安全问题
在JDK5.0之后新增加了一种更强大的线程同步机制---通过显示定义同步锁来实现线程同步解决线程安全问题.同步锁使用Lock对象充当. java.util.concurrent.locks.lock接 ...
- Java 集合详解 | 一篇文章解决Java 三大集合
更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...
- 静态同步方法和解决线程安全问题_Lock锁
静态的同步方法锁对象是谁?不能是thisthis是创建对象之后产生的,静态方法优先于对象静态方法的锁对象是本类的cLass属性-->class文件对象(反射) 卖票案例出现了线程安全问题 卖出了 ...
随机推荐
- hadoop错误org.apache.hadoop.mapred.TaskAttemptListenerImpl Progress of TaskAttempt
错误: org.apache.hadoop.mapred.TaskAttemptListenerImpl: Progress of TaskAttempt 原因: 错误很明显,磁盘空间不足,但郁闷的是 ...
- OC协议
概念:定义了一个接口,其他类负责来实现这些接口.如果你的类实现了一个协议的方法时,则说该类遵循此协议. 非正式协议:非正式协议虽名为协议,但实际上是挂于NSObject上的未实现分类(Unimplem ...
- 用php切割大图片为成规则的小图
将根据xml配置,将合并后的大图切割成一系列小图 <?php /** * 将大图片按照配置切割成一定比例的小图片 * 并按照一定规则给小图片命名 * * 使用方法: *根据guardians/g ...
- Base64原理简介
Base64是一种编码方式,通常用于将二进制数据转换成可见字符的形式,该过程可逆. 过程大致如下: 1. 对64个可见字符,进行一个索引编码.索引是二进制的值,对应找到一个可见字符. Base64 编 ...
- HDU-1012(水题)
http://acm.hdu.edu.cn/showproblem.php?pid=1012 分析:就按题目给的公式一步步输出就行了. #include<stdio.h> #include ...
- Liferay环境搭建实录
1. 安装Liferay IDE:打开Eclipse的Help-->Eclipse Marketplace,在下图所示搜索框中输入liferay,回车搜索: 搜索结果如下图所示: 点击insta ...
- H TML5 之 (2) 小试牛刀
基本的HTML都认识到了,就开始运用下了,大的程序的开始,都是从一个一个表达式慢慢的堆积起来的 想开始玩HTML5,就开始理解,它所提供的画布函数各有什么作用,API的具体使用,才能完成自己想要完成的 ...
- /etc目录深入理解
/etc This is the nerve center of your system, it contains all system related configuration files in ...
- 拥抱模块化的JavaScript
前言 我们再一次被计算机的名词.概念笼罩. Backbone.Emberjs.Spinejs.Batmanjs 等MVC框架侵袭而来.CommonJS.AMD.NodeJS.RequireJS.Sea ...
- Java中报错No enclosing instance of type caiquan is accessible. Must qualify the allocation with an enclosing instance of type caiquan (e.g. x.new A() where x is an instance of caiquan).
package test;import java.util.Scanner;import java.util.Random;public class caiquan { public static v ...