BUG: CodeChameleonConverter custom functions do not reach its identifier

未关闭
#3,761 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 2 天内回复

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
38/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
活跃
技术栈
python
领域
security

调研方向

Read codechameleon_converter.py, especially _build_identifier and the custom encryption/decryption handling at the referenced lines. Review the two strict xfail tests proposed in #3477 and settle whether identity should come from a caller-provided stable identifier or a fingerprint of the effective functions and rendered decrypt source. Done means converters using different custom functions have distinct identifiers, with tests covering the chosen behavior.

由索引模型根据 Issue 内容生成。

描述

Bug: triage
Describe the bug

With encrypt_type="custom", CodeChameleonConverter._build_identifier records only encrypt_type (codechameleon_converter.py:113). The encryption function decides the encoded prompt, and the decryption function's source is rendered into the prompt the model sees (source read at :150, rendered at :140-142), so converters built with different functions share one hash. As discussed in #3477, a qualified name is not enough either: two functions can share it with different code, closures or configuration.

Steps/Code to Reproduce

Run on main at 791e12c6e. Save as a file, since inspect.getsource needs one.

import asyncio

from pyrit.converter import CodeChameleonConverter
from pyrit.setup import IN_MEMORY, initialize_pyrit_async


def reverse_text(text):
    return text[::-1]


def upper_text(text):
    return text.upper()


async def main() -> None:
    await initialize_pyrit_async(memory_db_type=IN_MEMORY, silent=True)
    for function in (reverse_text, upper_text):
        converter = CodeChameleonConverter(encrypt_type="custom", encrypt_function=function, decrypt_function=function)
        result = await converter.convert_async(prompt="hello world")
        line = next(line for line in result.output_text.splitlines() if "need to solve" in line)
        print(line.strip(), converter.get_identifier().unique_name)


asyncio.run(main())
Expected Results

Different functions, different identifiers.

Actual Results
The encrypted_problem you need to solve is: dlrow olleh CodeChameleonConverter::505647f9
The encrypted_problem you need to solve is: HELLO WORLD CodeChameleonConverter::505647f9
Versions
  • OS: Windows 11
  • Python version: 3.12.0
  • PyRIT version: source checkout of main at 791e12c6e
System:
    python: 3.12.0 (tags/v3.12.0:0fb18b0, Oct  2 2023, 13:03:39) [MSC v.1935 64 bit (AMD64)]
executable: C:\dev\pyr-main\Scripts\python.exe
   machine: Windows-11-10.0.26300-SP0

Python dependencies:
        pyrit: 1.2.0.dev0
       Cython: None
        numpy: 2.4.6
       openai: 2.54.0
    packaging: 26.3
          pip: 23.2.1
        scipy: 1.17.1
   setuptools: 84.2.1
      sqlite3: None
        torch: None
 transformers: 5.20.2

Possible directions from #3477: a stable identifier passed by the caller, or a fingerprint of the effective function and rendered decrypt source. The test proposed in #3477 marks both settings as strict xfail linked to this issue. I can take this one once the direction is settled.

主要语言
Python
星标
4.7k
派生
1k
平均合并
2 天 2 小时
30 天内合并 PR
439

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

  • 没有 Dockerfile 或 Docker Compose 文件
  • 有 Pull Request 模板
  • 没有贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

microsoft/PyRIT 的其他 Issue

查看 microsoft/PyRIT 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。