From c4e2976166a94390ab0fd5bd0a395381b49d0f28 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 18:46:39 +0100 Subject: [PATCH 1/2] Fix hidden Unicode tag detection in ASCII smuggler --- pyrit/converter/token_smuggling/ascii_smuggler_converter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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.") From 75b782887acf58c55e5e56a746d0e69179b520f0 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 18:46:49 +0100 Subject: [PATCH 2/2] Add regression tests for Unicode tag logging --- .../test_ascii_smuggler_converter.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) 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")