我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

产品

产品

扩展隐私分析、攻击面扫描配置文件以及 GitHub 源代码映射改进

Ostorlab 2025 年 5 月更新带来了全面的隐私分析能力,新增 21 个数据收集类别并增强了验证工具。此次发布推出了专门的 Attack Surface 扫描配置文件以优化安全评估,新增 GitHub 源代码集成以精确映射漏洞,并实现了 QPS 速率限制以控制扫描。其他改进包括移动扫描的 URL 正则表达式控制、更简洁的 Jira 集成,以及扩展的指纹识别能力,以提高检测准确性。

📈 报告与导出增强

  • 改进 PDF 报告命名:改进了 PDF 导出文件的命名方式,让报告更易于整理和识别。
    PDF 导出命名

🎯 攻击面

  • 为 Attack Surface 扫描推出两个新的扫描配置文件,以便更好地控制扫描深度和重点:
    • Attack Surface KEV Scan:一种针对已知被利用漏洞(Known Exploited Vulnerabilities,KEV)的定向扫描,用于识别最严重且正被积极利用的安全问题。
    • Attack Surface Exhaustive Scan:一种全面扫描,彻底覆盖您组织的外部安全态势。现在,创建新的 Attack Surface 扫描时需要选择一个扫描配置文件
      Attack Surface 扫描配置文件

🔗 集成

  • 增强 GitHub 集成,以评论形式在代码中显示漏洞:通过 Ostorlab Github App 集成,当平台发现安全问题时,会在检测到漏洞的确切位置直接向您的拉取请求添加评论,并提供一键应用修复的按钮。这让开发人员能够直接在代码库中获得有关漏洞的即时上下文,无需在不同工具之间切换,就能更轻松地理解和修复安全问题。

🛡️ 扫描与漏洞管理

  • 实现了控制 QPS(Queries Per Second,每秒查询数)速率限制的选项,用于限制漏洞扫描期间的出站网络流量。该功能允许您为 Web App、Web API、Network 和 Attack Surface 扫描指定每秒查询数上限。
  • 在监控规则中新增范围 URL 正则表达式:新增支持在移动扫描中使用正则表达式模式将特定域名加入白名单。这样可以将测试范围缩小到应用中真正相关的部分。创建规则:
    Android 创建规则
    更新规则:
    Android 编辑规则

🎫 修复

  • 更简洁的 Jira 集成体验:Jira 工单创建流程的 UI 得到改进,界面更直观、更一致。
    Jira 集成 UI

🔒 合规与隐私

隐私分析增强

  • 新的隐私扫描摘要表:新增一张全面的表格,展示应用的数据收集做法,包括:
    • 隐私政策中声明的内容
    • 作为验证依据的政策原文引用
    • 我们的扫描在应用中检测到的内容
    • 发现不一致时的证据

这让您一眼就能更轻松地发现隐私合规问题。

隐私分析表

隐私政策分析扩展

  • 隐私扫描增强,新增 21 个数据收集类别,提供更全面的隐私政策分析。类别现包括:
    • 敏感个人信息(EMAIL、PERSONAL_IDENTIFIERS)
    • 财务数据(PAYMENT_FINANCIAL)
    • 敏感属性(BIOMETRIC_DATA、GENDER_IDENTITY、RELIGIOUS_BELIEFS、POLITICAL_AFFILIATIONS、PHILOSOPHICAL_BELIEFS、CRIMINAL_RECORD)
    • 位置跟踪(CURRENT_LOCATION、LOCATION_HISTORY)
    • 媒体访问(USER_PHOTOS_MEDIA)
    • 用户行为监控(SEARCH_QUERIES、APP_USAGE、BROWSING_ACTIVITY)

此次扩展能够更彻底地识别隐私问题,改进合规验证,并帮助您更好地了解应用中潜在的隐私风险。

🔍 检测

指纹识别增强

  • 新增对原生库的指纹识别:增强了对三个关键库的检测能力,这些库通常被打包在注重隐私的即时通讯应用中:

    • libsignal_jni:用于安全消息传递的核心加密库
    • libsqlcipher:保护本地消息存储的数据库加密库
    • libringrtc:用于安全语音和视频通话的 WebRTC 实现
  • 新增指纹识别:我们现在可以检测 mojoPortal、Craft CMS 和 FastCGI。

生物识别身份验证安全
  • 新增对不安全生物识别身份验证的检测:我们的新扫描器可以识别使用指纹或人脸识别但缺乏正确加密绑定的应用。它会检测生物识别验证未与加密密钥安全关联的情况,这是攻击者可以利用来绕过 Android 和 iOS 上安全控制的漏洞。

不安全生物识别身份验证的代码示例

下面是一个不安全的生物识别身份验证实现示例:CryptoObject 被传递给了生物识别提示,但实际上并未用于解密用户数据:

// VULNERABLE IMPLEMENTATION: Biometric authentication with CryptoObject but without actually using it

public class MisusedCryptoObjectAuthenticator {
    private static final String ENCRYPTED_DATA_KEY = "encrypted_data";
    private SharedPreferences preferences;
    private Cipher cipher;
    private SecretKey secretKey;

    public MisusedCryptoObjectAuthenticator(Context context) {
        this.preferences = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE);
        try {
            // Initialize crypto components
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(256);
            secretKey = keyGenerator.generateKey();
            cipher = Cipher.getInstance("AES/GCM/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void authenticateUser(final AuthenticationCallback callback) {
        try {
            // We create a CryptoObject and pass it to the biometric prompt
            BiometricPrompt.CryptoObject cryptoObject = new BiometricPrompt.CryptoObject(cipher);

            BiometricPrompt biometricPrompt = new BiometricPrompt(activity,
                    executor,
                    new BiometricPrompt.AuthenticationCallback() {
                        @Override
                        public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
                            // VULNERABILITY: We have the cryptoObject but don't use it!
                            // Instead, we just set a flag or retrieve data directly

                            // The CryptoObject from the result is ignored
                            BiometricPrompt.CryptoObject cryptoResult = result.getCryptoObject();

                            // Simply set authentication flag without using the CryptoObject
                            setAuthenticated(true);
                            callback.onSuccess();
                        }

                        @Override
                        public void onAuthenticationFailed() {
                            callback.onFailure("Authentication failed");
                        }
                    });

            // We pass the cryptoObject to authenticate
            biometricPrompt.authenticate(promptInfo, cryptoObject);

        } catch (Exception e) {
            callback.onFailure("Error: " + e.getMessage());
        }
    }

    private void setAuthenticated(boolean authenticated) {
        preferences.edit().putBoolean("is_authenticated", authenticated).apply();
    }

    // VULNERABILITY: This method retrieves sensitive data without requiring the
    // cryptoObject that was used during authentication
    public String getSensitiveData() {
        // Simply checks a boolean flag instead of using crypto binding
        if (preferences.getBoolean("is_authenticated", false)) {
            // Get data without using the CryptoObject for decryption
            String encryptedData = preferences.getString(ENCRYPTED_DATA_KEY, null);
            // We manually decrypt using our stored secretKey instead of
            // using the key bound to biometric authentication
            return decryptWithStoredKey(encryptedData);
        }
        return null;
    }

    private String decryptWithStoredKey(String encryptedData) {
        // Decrypt using the stored key, not the one from biometric authentication
        try {
            // This uses the class-level secretKey, not anything from the biometric result
            Cipher decryptCipher = Cipher.getInstance("AES/GCM/NoPadding");
            decryptCipher.init(Cipher.DECRYPT_MODE, secretKey);
            return new String(decryptCipher.doFinal(Base64.decode(encryptedData, Base64.DEFAULT)));
        } catch (Exception e) {
            return null;
        }
    }
}

漏洞说明: 1. 代码创建了一个 CryptoObject 并将其传递给生物识别身份验证流程 2. 然而,身份验证成功后,CryptoObject 被忽略了 3. 应用没有使用 CryptoObject 来解密敏感数据,而是: - 设置一个简单的布尔标志 - 使用另一个与生物识别验证无关的已存储密钥进行解密 4. 这使攻击者可以通过直接篡改已存储的标志或访问解密密钥来绕过生物识别安全机制

GraphQL 安全

  • 增强 GraphQL 分析器,在未检测到漏洞时报告安全(secure)漏洞结果,让您对安全评估更有信心。

Threat Center

我们新增了对多个 CVE 的支持:

  • CVE-2025-2825/CVE-2025-31161:严重的 CrushFTP 身份验证绕过——一个严重漏洞(CVSS 9.8),影响 CrushFTP 10.0.0-10.8.3 和 11.0.0-11.3.0 版本,可通过篡改 S3 风格的身份验证头部和 Cookie 完全绕过身份验证。

  • CVE-2025-22457:Ivanti 基于栈的缓冲区溢出——严重的远程代码执行漏洞,由于对 X-Forwarded-For HTTP 头部的验证不足,影响 Ivanti Connect Secure、Policy Secure 和 ZTA Gateways。

  • CVE-2025-2636:InstaWP Connect 插件 LFI 漏洞——热门 WordPress 插件 InstaWP Connect 中的严重本地文件包含漏洞,影响超过 30,000 个活跃安装。

  • CVE-2025-32432:Craft CMS 远程代码执行——严重的未经身份验证 RCE 漏洞,通过资产转换过程中的不安全反序列化,影响多个 Craft CMS 版本。

  • CVE-2024-12847:增强 Netgear 路由器命令注入检测——我们使用带随机令牌的动态 echo 载荷改进了检测,在保持漏洞检测准确性的同时消除了误报。

  • CVE-2019-9874:Sitecore Anti-CSRF 反序列化漏洞——Sitecore CMS 中的严重 RCE 漏洞,允许未经身份验证的攻击者通过不安全的反序列化执行任意代码。

  • CVE-2017-3066:通过 Java 反序列化实现的 Adobe ColdFusion RCE——严重漏洞,未经身份验证的攻击者可以通过发送特制的序列化 Java 对象执行任意代码。

  • CVE-2017-12637:SAP NetWeaver AS Java 目录遍历——高危漏洞,未经身份验证的攻击者可以通过路径遍历操纵访问服务器上的敏感文件。