如何解决 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 官方博客

时间: 2024-12-29 06:38:28

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

Spring-利用ThreadLocal解决线程安全问题

ThreadLocal是什么 ThreadLocal,顾名思义,它不是一个线程,而是线程的一个本地化对象.当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的变量副本.所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本.从线程的角度看,这个变量就像是线程的本地变量,这也是类名中"Local"所要表达的意思. ThreadLocal的方法很简单,主要的就是4个方法 1234567891011 // 设

java-ThreadLocal是解决线程安全问题

早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本. 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中"Local"所要表达的意思. 所以,在Java中编写线

Visual Basic .NET 和 Visual C# .NET 程序员需要解决的安全问题 (zt)

visual|安全|程序|程序员|解决|问题 Visual Basic .NET 和 Visual C# .NET 程序员需要解决的安全问题 Robin Reynolds-HaertleVisual Studio TeamMicrosoft Corporation 2002 年 1 月 摘要:本文着重讨论了 Visual Basic .NET 和 Visual C# .NET 开发人员在开始使用 .NET 框架时需要解决的主要安全问题.此概述讨论了 Windows 应用程序和 Web 应用程序,

解决Java ME设备碎片问题

一次编写.随处运行的口号曾驱动了 Java 编程语言的流行,但在 Java Micro Edition (Java ME) 的世界中却并不适用.屏幕大小.颜色深度和内存等设备功能显著不同.您必须选择配置文件.配置和 J2ME API,而且会碰到我们所谓的设备碎片问题.本教程介绍如何使用 IDE 的内置功能来解决 Java ME MIDP 设备碎片问题. 需求 开始之前,需要在您的计算机中安装以下软件: Java Standard Development Kit (JDK) 版本 5.0 或 6.

解决Java多线程并发的计数器问题

问题描述 解决Java多线程并发的计数器问题 3C public class Counter { public static int count = 0; public synchronized static void inc() { count++; } public static void main(String[] args) { //同时启动1000个线程,去进行i++计算,看看实际结果 for (int i = 0; i < 1000; i++) { new Thread(new Ru

解决Java J2EE乱码问题的方法_java

乱码是j2ee中一个比较常见的问题.遇到一两个问题的情况下,可以用new String(request.getParameter(xxx).getBytes("ISO-8859-1"),"UTF-8")来解决.遇到多的情况下,就最好用过滤器. 过滤器只需要注意2个地方即可--类和web.xml 1.在web.xml上面的发布如下: <fileter> <!-- 类名 --> <filter-name>SetCharsetEncod

【技术贴】java插入mysql中文乱码解决|java插入mysql数据库显示问号?

[技术贴]java插入mysql中文乱码解决|java插入mysql数据库显示问号?   在你要连接到mysql 的代码里写上?useUnicode=true&characterEncoding=UTF-8" 比如 "jdbc:mysql://localhost:3306/chenluancl1?useUnicode=true&characterEncoding=UTF-8", "root","密码"

求解决java 怎么打包成jar包问题

问题描述 求解决java 怎么打包成jar包问题 怎么把多个文件夹中的 .class文件打包成一个可执行的jar包 解决方案 http://blog.csdn.net/tfy1332/article/details/19573395 参考

解决Java中OutOfMemoryError的问题_java

目前为止,我遇到使用Tomcat有三种情况:第一,使用Eclipse,在Eclipse中配置Tomcat.第二,直接在Tomcat中部署项目.第三将Tomcat安装为windows服务. 在这三种情况下,出现OutOfMemoryError.该怎么解决呢?这里我不得不提我被网上那些不负责任的文章害得很惨.各种设置内存的方法都试了,可就是不起作用.下面我说的这几种方法都是我亲自试验过的,没有问题. 第一种情况:  如图:我用红色框框出来的.其中Xms和Xmx是增加java虚拟机初始堆大小和最大堆大