righettod/toolbox-ai-assisted-secure-code-review

GitHub: righettod/toolbox-ai-assisted-secure-code-review

一套基于 Claude Code 编码助手的安全代码审查工具箱,提供可视化代码概览、热点识别和扫描结果误报过滤等 AI 驱动的审查技能指令。

Stars: 2 | Forks: 0

![MadeWitVSCode](https://img.shields.io/static/v1?label=Made%20with&message=VisualStudio%20Code&color=blue&?style=for-the-badge&logo=visualstudio) # 描述 🧑‍💻 此文件夹包含我用于执行安全代码审查的编码助手*命令*。 🔬 核心目的是: 1. 学习如何在安全代码审查活动中,通过编码助手(这里是 claude code)利用 AI。 2. 定义一个在编码助手的帮助下,利用 AI 执行安全代码审查的流程。 3. 让我学习如何为编码助手创建指令,以便在安全代码审查活动中为我提供帮助。 # 审查流程 🔬 我设想了以下针对代码库使用 claude code 会话的流程: 🧑‍💻 在**代码库的根文件夹**下的 claude code 会话中的初始步骤: 1. 启动一个新的 claude code 会话:*这对于从上下文角度隔离处理非常重要*。 2. 调用命令 [`codebase-overview`](#case-1-codebase-overview) 以获取高风险 sink 的全局可视化概览。 🧑‍💻 在**模块的根文件夹**下的 claude code 会话中,针对代码库的每个模块,应用以下步骤: 1. 使用 [SemGrep](https://github.com/semgrep/semgrep) 扫描代码,通过基于模式的方法识别问题:目标是识别出与入口点无关的问题,例如,使用了已弃用的算法但并未从入口点进行调用。 2. 启动一个新的 claude code 会话:*这对于从上下文角度隔离处理非常重要*。 3. 调用命令 [`codebase-semgrep-findings-review`](#case-3-review-the-semgrep-scan-of-the-codebase) 从 SemGrep 扫描结果中过滤误报。 4. 启动一个新的 claude code 会话:*这对于从上下文角度隔离处理非常重要*。 5. 调用命令 [`codebase-hotspots`](#case-2-codebase-hotspots) 识别从安全角度来看会导致高风险处理的入口点。 6. 审查并手动验证步骤 **3** + 步骤 **5** 的结果。 ⚠️ 重要说明: * 采用**逐模块**的方法来加快审查速度。 * SemGrep 扫描是通过这个专用的 [工具箱](https://github.com/righettod/toolbox-codescan) 执行的。 # 基于不同场景(上下文)创建技能的起源 ## 场景 1:代码库概览 🤔 在这种情况下,背景是我收到了一个代码库,我想使用 claude code 为我提供以下概览: ``` A visual overview of the information entry points and where the information land including the type of processing and if such processing can be risky from a security perspective. ``` 📦 用户提示词作为 `claude code command` 存储在 `.claude/skills/codebase-overview/` 文件夹中的文件内 ([参考](.claude/skills/codebase-overview/SKILL.md))。 🤖 在 claude code 会话中通过以下指令使用它:`/codebase-overview [RELATIVE_PATH_TO_CODEBASE]`。 ✅ 生成的 Mermaid 代码已使用 [Mermaid Live](https://mermaid.live/) 编辑器进行验证,以检查其渲染效果、可读性以及所生成图表的有效性。选择 Mermaid 格式是因为它是一种基于文本的格式;因此,如果有必要,可以在生成后进行修改,或者发送给 LLM 进行额外的分析轮次。 ℹ️ 图例说明: * **六边形**代表*入口*点。 * **矩形**代表自定义代码*落地*点,带有用于指示所执行处理类型的 TAG,如果此类处理在安全视角下存在风险,则会进行着色。 * **圆形**代表第三方库*落地*点,如果执行的处理在安全视角下存在风险,则会进行着色。 ℹ️ 节点标签的命名约定定义在命令文件的 **[输出规则](.claude/skills/codebase-overview/SKILL.md#output-rules)** 部分中。 🔬 以下是针对 [OWASP WebGoat](https://github.com/WebGoat/WebGoat) 源代码,通过下载 *main* 分支的 zip 压缩包生成的示例 schema: ``` flowchart LR MAIN{{"StartWebGoat#main"}} --> LIB_SB(("Spring Boot")) HH{{"HammerHead#attack"}} --> P_SESSION["org.owasp.webgoat.container.session -- SESSION"]:::med REG{{"RegistrationController#registration"}} --> P_USERS["org.owasp.webgoat.container.users -- USER-MGMT -> AUTHN"]:::med REGO{{"RegistrationController#registrationOAUTH"}} --> P_USERS RPT{{"ReportCardController#reportCard"}} --> P_USERS MENU{{"LessonMenuService#showLeftNav"}} --> P_USERS PROG{{"LessonProgressService#lessonOverview"}} --> P_USERS RESTART{{"RestartLessonService#restartLesson"}} --> LIB_FLYWAY(("Flyway")):::high ENVSVC{{"EnvironmentService#homeDirectory"}} --> P_ENV["org.owasp.webgoat.container.service -- CONFIG-EXPOSURE"]:::med LBLDBG{{"LabelDebugService#setDebuggingStatus"}} --> P_ENV LBL{{"LabelService#fetchLabels"}} --> P_I18N["org.owasp.webgoat.container.i18n -- METADATA/I18N"] HINT{{"HintService#getHints"}} --> P_I18N FS_IMP{{"FileServer#importFile"}} --> LIB_FILE(("java.io / java.nio (file I/O)")):::high FS_GET{{"FileServer#getFiles"}} --> LIB_FILE MAIL{{"MailboxController#sendEmail"}} --> LIB_MAIL(("Spring Mail")) WJWT_D{{"JWTController#decode"}} --> LIB_JJWT(("io.jsonwebtoken (jjwt)")):::med WJWT_E{{"JWTController#encode"}} --> LIB_JJWT VERIFY{{"VerifyAccount#completed"}} --> P_AUTHBYPASS["org.owasp.webgoat.lessons.authbypass -- AUTHN"]:::med A1{{"Assignment1#completed"}} --> P_CHAL["org.owasp.webgoat.lessons.challenges -- AUTHN -> ACCOUNT-RECOVERY"]:::med A7R{{"Assignment7#resetPassword"}} --> P_CHAL A8V{{"Assignment8#vote"}} --> P_CHAL IMG{{"ImageServlet#logo"}} --> LIB_FILE A5{{"Assignment5#login"}} --> LIB_JDBC(("java.sql / JDBC")):::high A7L{{"Assignment7#sendPasswordResetLink"}} --> LIB_REST(("Spring RestTemplate")):::med ENC{{"EncodingAssignment#completed"}} --> P_CRYPTO["org.owasp.webgoat.lessons.cryptography -- CRYPTO"]:::med HMD5{{"HashingAssignment#getMd5"}} --> LIB_CRYPTO(("java.security / javax.crypto")):::med HSHA{{"HashingAssignment#getSha256"}} --> LIB_CRYPTO SDEF{{"SecureDefaultsAssignment#completed"}} --> LIB_CRYPTO SIGN{{"SigningAssignment#completed"}} --> LIB_CRYPTO SIGNK{{"SigningAssignment#getPrivateKey"}} --> LIB_CRYPTO FR_R{{"ForgedReviews#retrieveReviews"}} --> P_CSRF["org.owasp.webgoat.lessons.csrf -- CSRF/STATE-CHANGE"]:::med FR_C{{"ForgedReviews#createNewReview"}} --> P_CSRF DESER{{"InsecureDeserializationTask#completed"}} --> LIB_OIS(("java.io.ObjectInputStream")):::high HIJACK{{"HijackSessionAssignment#login"}} --> P_HIJACK["org.owasp.webgoat.lessons.hijacksession.cas -- AUTHN -> SESSION"]:::med IDOR_V{{"IDORViewOtherProfile#completed"}} --> P_IDOR["org.owasp.webgoat.lessons.idor -- AUTHZ -> ACCESS-CONTROL"]:::med IDOR_E{{"IDOREditOtherProfile#completed"}} --> P_IDOR IDOR_O{{"IDORViewOwnProfile#invoke"}} --> P_IDOR IDOR_L{{"IDORLogin#completed"}} --> P_IDOR INSLOG{{"InsecureLoginTask#completed"}} --> P_INSLOG["org.owasp.webgoat.lessons.insecurelogin -- AUTHN"]:::med JWT_DEC{{"JWTDecodeEndpoint#decode"}} --> P_JWT["org.owasp.webgoat.lessons.jwt -- AUTHN -> SESSION"]:::med JWT_SK{{"JWTSecretKeyEndpoint#login"}} --> LIB_JJWT JWT_RF{{"JWTRefreshEndpoint#newToken"}} --> LIB_JJWT JWT_VT{{"JWTVotesEndpoint#vote"}} --> LIB_JJWT JWT_JKU{{"JWTHeaderJKUEndpoint#resetVotes"}} --> LIB_AUTH0(("com.auth0.jwt")):::med JWT_KID{{"JWTHeaderKIDEndpoint#resetVotes"}} --> LIB_JDBC JWT_KID --> LIB_JJWT LOGSP{{"LogSpoofingTask#completed"}} --> P_LOG["org.owasp.webgoat.lessons.logging -- LOG-INJECTION"] LOGBL{{"LogBleedingTask#completed"}} --> LIB_SLF4J(("slf4j")) MAC_L{{"MissingFunctionACUsers#listUsers"}} --> P_MAC["org.owasp.webgoat.lessons.missingac -- AUTHZ -> ACCESS-CONTROL"]:::med MAC_S{{"MissingFunctionACUsers#usersService"}} --> LIB_JDBC MAC_A{{"MissingFunctionACUsers#addUser"}} --> LIB_JDBC MAC_H{{"MissingFunctionACHiddenMenus#completed"}} --> P_MAC OR1{{"OpenRedirectTask1#simulate"}} --> P_REDIR["org.owasp.webgoat.lessons.openredirect -- REDIRECT"]:::med OR4{{"OpenRedirectTask4#doubleDecode"}} --> P_REDIR ORR{{"OpenRedirectRealRedirect#real"}} --> P_REDIR PWL{{"ResetLinkAssignment#login"}} --> P_PWR["org.owasp.webgoat.lessons.passwordreset -- ACCOUNT-RECOVERY"]:::med PWC{{"ResetLinkAssignment#changePassword"}} --> P_PWR PWQ{{"SecurityQuestionAssignment#completed"}} --> P_PWR PWSML{{"SimpleMailAssignment#login"}} --> P_PWR PWSEND{{"ResetLinkAssignmentForgotPassword#sendPasswordResetLink"}} --> LIB_REST PU_UP{{"ProfileUpload#uploadFileHandler"}} --> LIB_FILE PU_GET{{"ProfileUpload#getProfilePicture"}} --> LIB_FILE PUF_UP{{"ProfileUploadFix#uploadFileHandler"}} --> LIB_FILE PUR_GET{{"ProfileUploadRetrieval#getProfilePicture"}} --> LIB_FILE PZ_UP{{"ProfileZipSlip#uploadFileHandler"}} --> LIB_ZIP(("java.util.zip")):::high PZ_GET{{"ProfileZipSlip#getProfilePicture"}} --> LIB_FILE SECPW{{"SecurePasswordsAssignment#completed"}} --> LIB_ZXCVBN(("Zxcvbn")) ACT_E{{"ActuatorExposureTask#actuatorEnv"}} --> P_SECMC["org.owasp.webgoat.lessons.securitymisconfiguration -- CONFIG-EXPOSURE"]:::med ACT_K{{"ActuatorExposureTask#submitApiKey"}} --> P_SECMC SPOOF{{"SpoofCookieAssignment#login"}} --> P_SPOOF["org.owasp.webgoat.lessons.spoofcookie -- SESSION -> CRYPTO"]:::med SQL2{{"SqlInjectionLesson2#completed"}} --> LIB_JDBC SQL5{{"SqlInjectionLesson5#completed"}} --> LIB_JDBC SQL8{{"SqlInjectionLesson8#completed"}} --> LIB_JDBC SQL10{{"SqlInjectionLesson10#completed"}} --> LIB_JDBC SQL13{{"SqlInjectionLesson13#completed"}} --> LIB_JDBC SQLC{{"SqlInjectionChallenge#registerNewUser"}} --> LIB_JDBC SQLCL{{"SqlInjectionChallengeLogin#login"}} --> LIB_JDBC SQL6A{{"SqlInjectionLesson6a#completed"}} --> LIB_JDBC SQLIV{{"SqlOnlyInputValidation#attack"}} --> LIB_JDBC SQL10B{{"SqlInjectionLesson10b#completed"}} --> LIB_JAVAC(("javax.tools.JavaCompiler")):::high VULN{{"VulnerableComponentsLesson#completed"}} --> LIB_XSTREAM(("XStream")):::high XSS5{{"CrossSiteScriptingLesson5a#completed"}} --> P_XSS["org.owasp.webgoat.lessons.xss -- XSS-SINK"] XSS_ST{{"StoredXssComments#retrieveComments"}} --> P_XSS XSS3{{"CrossSiteScriptingLesson3#completed"}} --> LIB_JSOUP(("Jsoup")) XXE_S{{"SimpleXXE#createNewComment"}} --> LIB_XML(("javax.xml (StAX/XXE)")):::high XXE_B{{"BlindSendFileAssignment#addComment"}} --> LIB_XML XXE_C{{"ContentTypeAssignment#createNewUser"}} --> LIB_XML XXE_R{{"CommentsEndpoint#retrieveComments"}} --> P_XXE["org.owasp.webgoat.lessons.xxe -- XML-PARSE"]:::high SSRF2{{"SSRFTask2#completed"}} --> LIB_NET(("java.net.URL")):::high classDef high fill:#fdd,stroke:#c00,color:#900 classDef med fill:#ffe9c7,stroke:#e08e00 ``` ## 场景 2:代码库热点 🤔 在这种情况下,背景是我收到了一个代码库,我想使用 claude code 指向从安全角度来看存在风险处理的代码(称为 **hotspot**)。 📦 用户提示词作为 `claude code command` 存储在 `.claude/skills/codebase-hotspots/` 文件夹中的文件内 ([参考](.claude/skills/codebase-hotspots/SKILL.md))。 🤖 在 claude code 会话中通过以下指令使用它:`/codebase-hotspots [RELATIVE_PATH_TO_CODEBASE]`。 ## 场景 3:审查代码库的 SemGrep 扫描结果 🤔 在这种情况下,我使用 SemGrep 扫描了代码库,以识别与入口点无关的问题,例如,使用了已弃用的算法但并未从入口点进行调用。 📦 用户提示词作为 `claude code command` 存储在 `.claude/skills/codebase-semgrep-findings-review/` 文件夹中的文件内 ([参考](.claude/skills/codebase-semgrep-findings-review/SKILL.md))。 🤖 在 claude code 会话中通过以下指令使用它:`/codebase-semgrep-findings-review [PATH_TO_SEMGREP_REPORT] [RELATIVE_PATH_TO_CODEBASE] [MINIMUM_CONFIDENCE_LEVEL]`。 💡 `[MINIMUM_CONFIDENCE_LEVEL]`:包含在输出中的最低置信度阈值,接受的值为: * `CONFIRMED`:仅包含已确认的发现。 * `PARTIAL`:已确认 + 需要人工审查的发现。 * 默认值:`PARTIAL` - `FALSE_POSITIVE`(误报)判定始终从发现列表中排除,但会记录在汇总表中。 # 兼容性说明 ⚠️ `SKILL.md` 文件使用 **Claude Code 技能格式**(Anthropic 专有),无法使用 [`skills-ref`](https://pypi.org/project/skills-ref/) (`pip install skills-ref`) 进行验证,因为该工具强制执行 [agentskills.io 开放规范](https://agentskills.io/specification)。该规范不允许使用 Claude Code 特有的 frontmatter 字段(如 `argument-hint`、`disable-model-invocation` 等)。 # 安装 🧑‍💻 将 [.claude/skills](.claude/skills/) 文件夹复制到待审查项目的 `.claude` 文件夹中,并在 claude code 会话中使用这些*命令*。 💡 也可以使用 [install.ps1](install.ps1) 脚本。 # 参考 * * *
标签:Libemu, Semgrep, Subfinder, VS Code, WordPress安全扫描, 人工智能, 代码审查, 开发辅助, 用户模式Hook绕过, 错误基检测, 静态代码分析