Apache Avro SDK曝關(guān)鍵漏洞,可在Java中執(zhí)行任意代碼
Apache Avro Java軟件開發(fā)工具包(SDK)中披露了一個關(guān)鍵安全漏洞,如果成功利用,可以在易受攻擊的實例上執(zhí)行任意代碼。該漏洞編號為CVE-2024-47561,影響1.11.4之前版本的所有軟件。Databricks安全團隊的Kostya Kortchinsky被發(fā)現(xiàn)并報告了這個安全缺陷。
Apache Avro與谷歌的Protocol Buffers(protobuf)類似,是一個為大規(guī)模數(shù)據(jù)處理提供語言中立的數(shù)據(jù)序列化框架的開源項目,提供緊湊、快速且高效的數(shù)據(jù)格式。它在大數(shù)據(jù)處理、分布式系統(tǒng)和云計算中被廣泛使用。項目維護者發(fā)布公告稱,“Apache Avro 1.11.3及之前版本的Java SDK中的模式解析允許惡意行為者執(zhí)行任意代碼,建議用戶升級到1.11.4或1.12.0版本,這些版本修復(fù)了此問題?!?/p>
Avro團隊進一步指出,如果應(yīng)用程序允許用戶提供自己的Avro模式進行解析,則該漏洞會影響任何應(yīng)用程序。
“CVE-2024-47561影響Apache Avro 1.11.3及之前版本,在通過avroAvro模式反序列化接收到的輸入時。處理來自威脅行為者的此類輸入會導(dǎo)致代碼執(zhí)行。根據(jù)我們的威脅情報報告,沒有公開的PoC,但這個漏洞存在于通過ReflectData和SpecificData指令處理包時,也可以通過Kafka利用。
緩解措施
1. 更新 Apache Avro SDK
確保您使用的是最新版本的 Apache Avro SDK來解決此漏洞。
xml
<!-- 示例 Maven 依賴 -->
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.10.2</version> <!-- 使用最新版本 -->
</dependency>
2. 驗證輸入數(shù)據(jù)
在反序列化任何數(shù)據(jù)之前,請根據(jù)預(yù)定義的模式對其進行驗證,或使用白名單方法確保只處理預(yù)期的數(shù)據(jù)格式。
java
import org.apache.avro.Schema;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.DatumReader;
import java.io.File;
public class AvroDeserializer {
public static void main(String[] args) throws Exception {
File file = new File("example.avro");
Schema schema = new Schema.Parser().parse(new File("schema.avsc"));
DatumReader<GenericRecord> datumReader = new GenericDatumReader<>(schema);
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<>(file, datumReader);
for (GenericRecord record : dataFileReader) {
// 驗證記錄是否符合模式
if (isValid(record)) {
// 處理記錄
} else {
throw new SecurityException("數(shù)據(jù)格式無效");
}
}
}
private static boolean isValid(GenericRecord record) {
// 在此處實現(xiàn)您的驗證邏輯
return true;
}
}
3. 使用安全的反序列化庫
考慮使用提供額外保護層以防止 RCE 攻擊的安全反序列化庫。例如,Jackson 庫提供了 `@JsonTypeInfo` 和 `@JsonSubTypes` 等功能來控制反序列化。
4. 實施輸入清理
在反序列化之前對輸入數(shù)據(jù)進行清理,以刪除潛在的惡意內(nèi)容。這有助于防止執(zhí)行未經(jīng)授權(quán)的代碼。
5. 監(jiān)控和記錄反序列化事件
實施日志記錄和監(jiān)控反序列化事件,以便及時發(fā)現(xiàn)任何可疑活動。
6. 使用安全掃描器
定期使用安全掃描器和工具來識別應(yīng)用程序及其依賴項中的漏洞。
使用 Jackson 進行安全反序列化的示例:
java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
public class SecureDeserializer {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
.allowIfBaseType(Object.class)
.build();
objectMapper.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.NON_FINAL);
// 安全地反序列化數(shù)據(jù)
MyObject obj = objectMapper.readValue(jsonString, MyObject.class);
}
}
通過遵循這些實踐,可以降低使用 Apache Avro 的 Java 應(yīng)用程序中遠程代碼執(zhí)行漏洞的風(fēng)險。