diff --git a/pyrit/converter/token_smuggling/ascii_smuggler_converter.py b/pyrit/converter/token_smuggling/ascii_smuggler_converter.py index c91059d3ea..9a10d3f947 100644 --- a/pyrit/converter/token_smuggling/ascii_smuggler_converter.py +++ b/pyrit/converter/token_smuggling/ascii_smuggler_converter.py @@ -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.") diff --git a/tests/unit/converter/test_ascii_smuggler_converter.py b/tests/unit/converter/test_ascii_smuggler_converter.py index f5fe442862..62b45495ac 100644 --- a/tests/unit/converter/test_ascii_smuggler_converter.py +++ b/tests/unit/converter/test_ascii_smuggler_converter.py @@ -1,6 +1,8 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT license. +import logging + import pytest from pyrit.converter import AsciiSmugglerConverter, ConverterResult @@ -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")