IPBUF安全漏洞报告
English
CVE-2026-42576 CVSS 6.5 中危

CVE-2026-42576 apko拒绝服务漏洞

披露日期: 2026-05-09

漏洞信息

漏洞编号
CVE-2026-42576
漏洞类型
拒绝服务
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
apko

相关标签

拒绝服务DoSapko类型混淆容器安全CVE-2026-42576

漏洞概述

apko是一款用于从apk包构建和发布OCI容器镜像的工具。在1.2.7版本之前,pkg/apk/apk/implementation.go文件中的DiscoverKeys函数在处理JWKS密钥时,无条件地将密钥断言为*rsa.PublicKey类型,而未检查密钥的实际类型。如果仓库的JWKS端点返回非RSA类型的密钥(例如EC密钥),这种未经检查的类型断言将导致程序panic并崩溃。该漏洞影响任何初始化APK数据库并获取仓库密钥的工作流程。

技术细节

该漏洞位于apko项目的pkg/apk/apk/implementation.go文件中,具体涉及DiscoverKeys函数的实现。问题根源在于代码直接使用了Go语言的类型断言,假设从JWKS端点获取的公钥必定是RSA类型。然而,JWKS标准支持多种加密算法,包括EC(椭圆曲线)等。当攻击者或配置错误的仓库返回非RSA密钥时,类型断言失败,触发Go语言的运行时panic机制,导致整个apko进程异常终止。这种拒绝服务漏洞利用门槛较低,攻击向量为网络,且无需用户认证,仅需用户访问受影响的仓库即可触发。由于Availability影响为高,这可能导致构建流水线中断或容器镜像构建服务不可用。修复方案是在断言前增加对密钥类型的检查逻辑。

攻击链分析

STEP 1
步骤1
攻击者控制或诱导目标使用一个恶意的APK仓库,该仓库的JWKS端点配置为返回非RSA类型的公钥(如ECDSA密钥)。
STEP 2
步骤2
受害者使用受影响版本的apko(< 1.2.7)尝试初始化APK数据库并从该仓库获取密钥。
STEP 3
步骤3
apko的DiscoverKeys函数获取到ECDSA密钥后,执行无条件类型断言将其转换为*rsa.PublicKey。
STEP 4
步骤4
类型不匹配导致Go语言运行时发生panic,apko进程崩溃,导致构建任务中断(拒绝服务)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
package main import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/rsa" "fmt" ) // Simulate the vulnerable DiscoverKeys function func vulnerableDiscoverKeys(key interface{}) { // Vulnerability: Unconditional type assertion to *rsa.PublicKey rsaKey := key.(*rsa.PublicKey) fmt.Println("RSA Key found:", rsaKey) } func main() { // Generate an ECDSA key to simulate a non-RSA key from JWKS privKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) ecPubKey := &privKey.PublicKey fmt.Println("Attempting to process EC key as RSA key...") // Recover from panic to demonstrate the crash defer func() { if r := recover(); r != nil { fmt.Println("[PoC Result] Panic triggered (DoS successful):", r) } }() // Trigger the vulnerability by passing an EC key to the function expecting RSA vulnerableDiscoverKeys(ecPubKey) }

影响范围

apko < 1.2.7

防御指南

临时缓解措施
建议立即将apko升级至1.2.7或更高版本以修复此漏洞。如果无法立即升级,应验证并信任所有配置的APK仓库,确保其JWKS端点不会返回非RSA类型的密钥,从而避免触发程序崩溃。

参考链接