Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

BUG: LetterBijectionConverter accepts a negative fixed_size and then leaves the prompt unchanged

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

维护者通常 2 天内回复

@ShivamSharma43 已经在做这个了。

开始于 2026年10月21日。

  • #3436 来自 @ShivamSharma43 —— 未关闭

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
停滞
技术栈
python
领域
ai, security

调研方向

Start at LetterBijectionConverter and inspect how fixed_size is used to split the lowercase alphabet and build the identifier. Check the existing tests for fixed_size=0 and fixed_size=26, then add coverage for invalid values and verify they raise a ValueError naming fixed_size. A pull request is already open for this issue.

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

描述

Describe the bug

LetterBijectionConverter(fixed_size=...) uses fixed_size as a slice bound on the 26 lowercase letters (letters[:fixed_size] stay fixed, letters[fixed_size:] are shuffled) but never validates it. A negative value is read from the end of the alphabet instead of being rejected:

  • fixed_size=-1 keeps the first 25 letters fixed and "shuffles" only z with itself, so the mapping is the identity and the converter sends the prompt to the target unchanged (attack at dawn -> attack at dawn).
  • fixed_size=-3 keeps 23 letters fixed and shuffles only x, y, z, so most prompts also go out in plaintext.
  • fixed_size=27 is accepted (identity mapping, identifier says 27), True is accepted as 1 (identifier says True), and 2.5 fails with slice indices must be integers or None or have an __index__ method.

The identifier records the invalid value, so a run looks like a bijection attack in memory while the target actually received plaintext.

Steps/Code to Reproduce
import asyncio
from pyrit.converter import LetterBijectionConverter

async def main():
    for fixed_size in (-1, -3, 27, True, 2.5):
        try:
            converter = LetterBijectionConverter(fixed_size=fixed_size, seed=1)
            unchanged = sum(1 for k, v in converter.mapping.items() if k == v)
            output = (await converter.convert_async(prompt="attack at dawn")).output_text
            print(repr(fixed_size), "unchanged letters:", unchanged, "->", output)
        except Exception as e:
            print(repr(fixed_size), "->", type(e).__name__, e)

asyncio.run(main())
Expected Results

fixed_size must be an integer from 0 to 26 (both already used: fixed_size=0 shuffles every letter and fixed_size=26 is tested as the identity mapping). Anything else raises a ValueError naming fixed_size.

Actual Results
-1 unchanged letters: 26 -> attack at dawn
-3 unchanged letters: 24 -> attack at dawn
27 unchanged letters: 26 -> attack at dawn
True unchanged letters: 3 -> axxagu ax badp
2.5 -> TypeError slice indices must be integers or None or have an __index__ method
Screenshots

N/A

Versions
  • OS: Windows 11
  • Python version: 3.11.9
  • PyRIT version: installed from main (ac196e57) in editable mode
主要语言
Python
星标
4.6k
派生
962
平均合并
2 天 13 小时
30 天内合并 PR
417

环境准备

在 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 摘要。