本文介绍 GitHub Copilot 现代化的应用评估功能可以检测的内容。 评估涵盖两个关键功能:
在您的现代化旅程中,问题检测在三个关键域内至关重要:
- 云就绪情况:识别 16 类问题,包括文件系统使用情况、凭据管理、消息服务、数据库连接、容器化差距、会话处理、远程通信模式等。
- Java 升级:标记过时的 Java 版本、OSS 支持终止框架(Spring Boot、Spring Cloud、Jakarta EE)、数百个已删除或弃用的 API 以及旧生成工具(如 Ant)。
- 安全性:检测来自 ISO/IEC 5055 标准的 42 个安全漏洞,包括注入漏洞(SQL、LDAP、XPath、OS 命令)、硬编码凭据和加密密钥、同步问题、资源生命周期问题和其他影响重大的 CWE。
应用程序理解:对于旧代码库,评估会显示正在使用的依赖项和技术,因此在开始迁移之前,可以清楚地了解应用程序依赖的内容。
以下部分详细介绍了每个域的问题覆盖范围。
领域:云就绪
| 域名 | 类别 | 检测摘要 | 为什么它很重要 |
|---|---|---|---|
cloud-readiness |
credential-migration |
检测硬编码的 AWS 凭据(aws_access_key_id、 aws_secret_access_keyAWS 机密管理器使用情况和嵌入式机密管理库,如 Spring Cloud Vault)。 |
安全: 硬编码的凭据和特定于供应商的机密存储非常易受攻击。 云原生应用程序需要集中的基于标识的安全性,以防止凭据被盗。 |
cloud-readiness |
region-configuration |
在代码或配置文件中标识硬编码的 AWS 区域标识符(aws.region、 AWS_REGION)。 |
可移植性: 硬编码地理区域将应用程序与特定供应商的物理基础结构联系在一起,从而阻碍了全球部署和复原能力。 |
cloud-readiness |
storage-migration |
检测 AWS S3 SDK 使用情况(存储桶、对象、预签名 URL)、S3 TransferManager 和 Google Cloud Storage 客户端库。 | 可靠性和对齐方式: 这些依赖项将你锁定在供应商的对象存储中,并且不适用于目标平台的本机存储服务。 |
cloud-readiness |
messaging-service-migration |
标记 Amazon SQS/SNS、Kafka、RabbitMQ(AMQP)、ActiveMQ(Artemis)、IBM MQ、TIBCO EMS、Solace PubSub+、Amazon Kinesis、Apache Pulsar 和 Google Cloud Pub/Sub 的依赖项和连接字符串。 | 可伸缩性和可靠性: 旧消息传送代理通常依赖于固定终结点和基于磁盘的持久性,从而阻碍云环境中的水平缩放和高可用性。 |
cloud-readiness |
database-migration |
检测 MongoDB、MySQL、PostgreSQL、MSSQL、Cassandra、MariaDB、Oracle、Db2、Sybase ASE、Firebird、SQLite、Google Firestore 和 Google Cloud Spanner 的连接字符串、驱动程序和超时设置。 | 可靠性: 自托管数据库或非本机数据库缺少自动扩展功能。 硬编码的超时时间和固定的重试间隔可能会导致在部分中断期间出现阻塞和过频重试(或称“重试风暴”)。 |
cloud-readiness |
file-system-management |
标识使用相对/绝对路径、主路径(/home/)、 file:// 方案和标准 Java IO/NIO 或 Apache Commons IO 调用进行本地存储访问。 |
无状态: 云容器是临时的。 写入本地文件系统会导致实例重启或缩放操作时数据丢失;持久数据必须外部化。 |
cloud-readiness |
local-credential |
在属性或 XML 文件中标记 Java KeyStore (.jks) 文件、 KeyStore.load 方法调用和明文密码(password, pwd)。 |
安全风险: 如果未经授权的个人访问应用程序环境或配置文件,则存储在明文或本地文件中的敏感材料很容易泄露。 |
cloud-readiness |
configuration-management |
检测应用程序设置的System.getenv、外部System.getProperty.properties/.xml/.ini文件和 Windows 注册表访问权限。 |
外部化:特定于操作系统的存储或本地文件无法大规模管理,并且不能在无需对所有实例进行代码更改的情况下动态更新。 |
cloud-readiness |
session-management |
在 HttpSession 对象中识别数据存储,并在 Web 描述符中使用“可分发”标记。 |
可 伸缩 性: 标准 HTTP 会话不适用于云缩放;状态必须外部化到分布式缓存,以防止在实例之间的流量转移期间数据丢失。 |
cloud-readiness |
remote-communication |
检测紧密耦合的协议(CORBA、RMI、JCA)、不安全的 HTTP/FTP 协议、Java 邮件 API、直接套接字/NIO 通道使用情况和硬编码 URL。 | 云兼容性和安全性: 紧密耦合的交互会阻碍可伸缩性。 不安全的协议和硬编码 URL 在动态云网络环境中易受攻击和脆弱。 |
cloud-readiness |
jakarta-migration |
检测来自 JBoss EAP、WebLogic 或 WebSphere 的 Jakarta/Java EE 特定 API 的使用情况,这些 API 适用于 NoSQL、JPA、Data、WebSocket 和 JAX-RS,以及特定于服务器的项目。 | 保障性: 迁移到云原生运行时需要与新式 Jakarta 命名空间保持一致,并删除专有应用程序服务器依赖项,以确保可移植性。 |
cloud-readiness |
containerization |
标记缺少 Dockerfile 或有问题的 Dockerfile 指令,例如 apt-get upgrade小写语法和语法间距问题。 |
可靠性: 容器生成中的标准化是稳定且可重现的部署所必需的,并确保映像在不同环境中可预测地运行。 |
cloud-readiness |
scheduled-job-migration |
识别 AWS Lambda 处理程序、Google Cloud Functions、Quartz Scheduler 依赖项和 Spring Batch 处理工作流。 | 云计算对齐方式: 必须重构计划的作业和无服务器函数,以使用目标云的事件驱动和无服务器计算模型来降低基础结构开销。 |
cloud-readiness |
apm-migration |
标识 New Relic、Elastic APM 和 Dynatrace 的嵌入式 APM 代理和库。 | 可观察性: 这些工具需要特定的云平台集成,以便在托管环境中正确捕获遥测数据、延迟和运行状况数据。 |
cloud-readiness |
auth-migration |
检测 SAML/OpenSAML、OAuth 2.0、OpenID、Spring Security、LDAP 使用情况和旧版 Webform 身份验证模式。 | 新式标识: 旧版 Webform 和 LDAP 身份验证缺乏基于声明的新式云标识提供者的灵活性和安全功能(MFA、SSO)。 |
cloud-readiness |
os-compatibility |
标识特定于 Windows 的 Dynamic-Link 库(.dll 文件)上的项目依赖项。 | 可移植性: DLL 特定于 OS,并且不会在基于 Linux 的标准云容器环境中运行。 需要将它们替换为跨平台共享库。 |
域:java-upgrade
| 域名 | 类别 | 检测摘要 | 为什么它很重要 |
|---|---|---|---|
java-upgrade |
java-version-upgrade |
标识非 LTS Java 版本的用法(9、10、12-16、19、20)和旧版本(1.x 到 8 和 11)。 | 安全性和支持: 旧版本和非 LTS 版本包含已知漏洞,并且缺少长期维护更新,使基础结构暴露在攻击中。 |
java-upgrade |
framework-upgrade |
检测已不再获得 OSS 支持的 Spring Boot、Spring Cloud、Spring Framework 和 Jakarta EE 版本。 | 保障性: 过时框架停止接收安全修补程序,使应用程序面临安全风险,并与新式云原生工具不兼容。 |
java-upgrade |
deprecated-apis |
从 JBoss、Seam 2、WebLogic 和 WebSphere 中编录了数百个已删除或弃用的 API,包括方法sun.misc.BASE64、Thread.stop和专有挂钩SecurityManager。 |
稳定性和可移植性: 使用已删除的 API 会导致新式 JVM 上的运行时崩溃。 专有供应商钩子(如 WebLogic/JBoss 内部程序)阻止了应用程序在标准运行时之间的移植。 |
java-upgrade |
build-tool |
标识旧版生成系统,如 Ant (build.xml) 或 Eclipse 特定的项目配置(WTP/JEM 性质)。 |
自动化: 旧工具缺少有效集成到新式 CI/CD 管道所需的标准约定和依赖项管理。 |
领域:安全性(ISO 5055 指导)
ISO/IEC 5055 是一种 ISO 标准,用于根据四个业务关键因素衡量软件产品的内部结构:安全性、可靠性、性能效率和可维护性。 这些因素决定了软件系统的可信度、可靠性和复原能力。 从本质上讲,ISO 5055 旨在“发现和防止导致 90% 生产问题的 8 个% 缺陷”。 ISO 5055 在每个质量特征下标识最关键且影响最大的 CWE:可靠性、性能效率、安全性和可维护性。 对于 GitHub Copilot 的现代化,您可以根据 ISO 5055 中定义的安全常见漏洞枚举(CWEs)检测,如下表所示。
| CWE_ID | 标题 | 说明 |
|---|---|---|
CWE-22 |
对受限目录的路径名称的不当限制(“路径遍历”) | 该产品使用外部输入来构造一个路径名,用于标识受限制的父目录下的文件或目录。 但是,它无法有效中和那些可能导致路径名称解析到受限目录之外的特殊元素。 |
CWE-23 |
相对路径遍历 | 该产品使用外部输入在受限目录内构造路径名称,但无法消除此类 ..序列,此类序列可以在该目录外部解析。 |
CWE-36 |
绝对路径遍历 | 该产品使用外部输入在受限目录内构造路径名称,但无法消除绝对路径序列(例如 /abs/path,可以在该目录外部解析)。 |
CWE-77 |
命令中使用的特殊元素的不当中和化(“命令注入”) | 该产品使用外部影响输入来构造命令,但不会消除可修改发送到下游组件的预期命令的特殊元素。 |
CWE-78 |
OS 命令中使用的特殊元素的不当中和化(“OS 命令注入”) | 该产品使用外部影响输入构造 OS 命令,但无法消除可能修改发送到下游组件的预期 OS 命令的特殊元素。 |
CWE-88 |
命令中参数分隔符的未正确中和性(“参数注入”) | 该产品为单独的组件构造命令字符串,但未正确分隔该字符串中的参数、选项或开关。 |
CWE-79 |
在网页生成期间输入不当中和(“跨网站脚本”) | 产品未能在用户可控制输入用于提供给其他用户的网页输出前对其进行净化。 |
CWE-89 |
SQL 命令中使用的特殊元素的不当中和化(“SQL 注入”) | 该产品使用外部影响输入来构造 SQL 命令,但无法消除可以修改命令的元素,从而允许将输入解释为 SQL 语法而不是普通数据。 |
CWE-564 |
SQL 注入:休眠 | 使用 Hibernate 执行使用用户控制的输入生成的动态 SQL 语句,攻击者可以修改语句的含义或执行任意 SQL 命令。 |
CWE-90 |
对 LDAP 查询中使用的特殊元素进行不当处理(“LDAP 注入”) | 该产品使用外部影响输入构造 LDAP 查询,但无法消除可能修改发送到下游组件的预期查询的元素。 |
CWE-91 |
XML 注入(也称为盲 XPath 注入) | 该产品未正确中和 XML 中使用的特殊元素,使攻击者能够在处理之前修改语法、内容或命令。 |
CWE-99 |
资源标识符的不当控制(“资源注入”) | 产品接收输入,但在将它用作目标控制范围之外的资源的标识符之前,它不会正确限制它。 |
CWE-130 |
长度参数不一致错误的处理 | 产品分析格式化的消息或结构,但错误地处理与关联数据的实际长度不一致的长度字段。 |
CWE-259 |
使用硬编码密码 | 该产品包含一个硬编码的密码,用于其自己的入站身份验证或外部组件的出站通信。 |
CWE-321 |
使用硬编码加密密钥 | 该产品使用硬编码、不可更改的加密密钥。 |
CWE-434 |
具有危险类型的文件不受限制的上传 | 该产品允许上传在其环境中自动处理的危险文件类型。 |
CWE-456 |
缺少变量的初始化 | 该产品不会初始化关键变量,导致执行环境使用意外值。 |
CWE-457 |
使用未初始化的变量 | 该代码使用未初始化的变量,从而导致不可预知或意外的结果。 |
CWE-477 |
使用已过时函数 | 该代码使用已弃用或过时的函数,这表明它没有被积极审查或维护。 |
CWE-502 |
不受信任的数据的反序列化 | 产品在不充分确保生成的数据有效的情况下反序列化不受信任的数据。 |
CWE-543 |
在多线程上下文中使用未同步的单例模式 | 产品在多线程环境中创建资源时使用单一实例模式,而无需进行适当的同步。 |
CWE-567 |
对多线程上下文中共享数据的未同步访问 | 产品无法正确同步共享数据,例如跨线程的静态变量,从而导致未定义的行为。 |
CWE-570 |
表达式始终为 False | 产品包含始终计算结果为 false 的表达式。 |
CWE-571 |
表达式始终为真 | 产品包含始终计算结果为 true 的表达式。 |
CWE-606 |
未验证的循环条件输入 | 该产品无法正确检查用于循环条件的输入,这可能会导致拒绝服务过度循环。 |
CWE-643 |
在 XPath 表达式中未正确中和数据(“XPath 注入”) | 该产品使用外部输入来动态构造 XML 数据库的 XPath 表达式,但无法消除该输入。 |
CWE-652 |
在 XQuery 表达式中未正确中和数据(“XQuery 注入”) | 该产品使用外部输入来动态构造 XQuery 表达式,但未能正确中和该输入。 |
CWE-662 |
同步不当 | 该产品允许多个线程或系统访问共享资源,而无需进行适当的同步,这可能会导致同时访问问题。 |
CWE-665 |
初始化不当 | 产品未初始化或错误地初始化了资源,这可能导致在访问资源时处于未预期的状态。 |
CWE-667 |
锁定不当 | 产品无法正确获取或释放资源上的锁,从而导致意外的状态更改。 |
CWE-672 |
在过期或发布后对资源执行的操作 | 产品在资源过期、释放或吊销后访问或操作。 |
CWE-681 |
数值类型之间的转换不正确 | 在类型转换期间,可以省略数据或转换为意外值,如果在敏感上下文中使用,这可能很危险。 |
CWE-682 |
计算不正确 | 该产品执行计算,该计算会在以后用于安全关键决策或资源管理时生成不正确的结果。 |
CWE-732 |
关键资源的权限分配不正确 | 以允许意外执行组件读取或修改它的方式指定安全关键资源的权限。 |
CWE-772 |
有效生存期后资源未被释放 | 产品在有效生存期结束后不会释放资源,不再需要该资源。 |
CWE-775 |
在有效生存期内缺少文件描述符或句柄的发布 | 产品在不再需要文件描述符或句柄后无法发布。 |
CWE-778 |
日志记录不足 | 产品在记录安全关键事件时无法记录或省略重要详细信息。 |
CWE-783 |
运算符优先级逻辑错误 | 运算符优先级的问题导致表达式的逻辑错误。 |
CWE-789 |
内存分配大小值过大 | 该产品根据不受信任的大大小值分配内存,而无需确保其符合预期限制。 |
CWE-798 |
使用硬编码凭据 | 该产品包含硬编码凭据,例如密码或加密密钥。 |
CWE-820 |
缺少同步 | 该产品同时利用共享资源,而无需尝试同步访问。 |
CWE-821 |
同步不正确 | 该产品同时利用共享资源,但无法正确同步访问。 |
CWE-835 |
具有无法访问的退出条件的循环(“无限循环”) | 该产品包含一个迭代或循环,其中包含无法达到的退出条件。 |
CWE-611 |
XML 外部实体引用限制不正确 | 产品处理包含具有 URI 的实体的 XML 文档,这些 URI 解析在预期的控制域之外。 |
CWE-1057 |
预期数据管理器组件之外的数据访问操作 | 该产品执行数据访问操作,以绕过设计所需的专用中央数据管理器组件。 |