Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion pyrit/converter/token_smuggling/ascii_smuggler_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,18 @@ def decode_message(self, *, message: str) -> str:
str: The decoded message.
"""
decoded_message = ""
hidden_tags_found = False
for char in message:
code_point = ord(char)
if 0xE0000 <= code_point <= 0xE007F:
hidden_tags_found = True
decoded_char = chr(code_point - 0xE0000)
if not 0x20 <= ord(decoded_char) <= 0x7E:
logger.info(f"Potential unicode tag detected: {decoded_char}")
else:
decoded_message += decoded_char

if len(decoded_message) != len(message):
if hidden_tags_found:
logger.info("Hidden Unicode Tags discovered.")
else:
logger.info("No hidden Unicode Tag characters discovered.")
Expand Down
23 changes: 23 additions & 0 deletions tests/unit/converter/test_ascii_smuggler_converter.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

import logging

import pytest

from pyrit.converter import AsciiSmugglerConverter, ConverterResult
Expand All @@ -24,6 +26,27 @@ async def test_ascii_smuggler_decode_roundtrip():
assert decoded.output_text == "hello"


async def test_ascii_smuggler_decode_reports_hidden_tags(caplog):
encoder = AsciiSmugglerConverter(action="encode")
encoded = await encoder.convert_async(prompt="hello", input_type="text")

caplog.set_level(logging.INFO)
decoder = AsciiSmugglerConverter(action="decode")
await decoder.convert_async(prompt=encoded.output_text, input_type="text")

assert "Hidden Unicode Tags discovered." in caplog.messages
assert "No hidden Unicode Tag characters discovered." not in caplog.messages


async def test_ascii_smuggler_decode_reports_no_hidden_tags_for_plain_text(caplog):
caplog.set_level(logging.INFO)
decoder = AsciiSmugglerConverter(action="decode")
await decoder.convert_async(prompt="hello", input_type="text")

assert "No hidden Unicode Tag characters discovered." in caplog.messages
assert "Hidden Unicode Tags discovered." not in caplog.messages


async def test_ascii_smuggler_with_unicode_tags():
converter = AsciiSmugglerConverter(action="encode", unicode_tags=True)
result = await converter.convert_async(prompt="hi", input_type="text")
Expand Down