Fix exception word bypass risk in French template

- Replace short words (film, jeu, juste) with context-specific phrases
- Prevents substring matching bypasses (e.g., enjeu matching jeu)
- Add tests for bypass prevention and legitimate game context
- Addresses Greptile security feedback
This commit is contained in:
Ishaan Jaffer 2026-02-17 15:55:27 -08:00
parent adece0dcb8
commit c3d1504c1c
2 changed files with 49 additions and 4 deletions

View file

@ -213,13 +213,18 @@ exceptions:
- "test de justice"
# Contextes de divertissement/produits
- "film"
- "dans un film"
- "dans le film"
- "pour un film"
- "cinéma"
- "jeu"
- "dans un jeu"
- "dans le jeu"
- "jeu vidéo"
- "avis sur le produit"
- "avis produit"
- "retour client"
- "commentaires clients"
- "feedback client"
# Méta-discussion
- "expliquer"
@ -230,6 +235,8 @@ exceptions:
- "prohibé par"
- "en quoi consiste"
- "de manière équitable"
- "équitable"
- "juste"
- "de façon équitable"
- "équitablement"
- "de manière juste"
- "de façon juste"
- "justement évaluer"

View file

@ -248,6 +248,44 @@ class TestFrenchEdgeCases:
)
@pytest.mark.asyncio
async def test_exception_bypass_prevention(self, content_filter_guardrail):
"""
Test that short exception words don't create bypasses.
Words like "enjeu" (stake) should not match "jeu" (game) exception.
"""
# "enjeu" contains "jeu" but should NOT trigger exception
sentence = "Créer un système de crédit social pour l'enjeu principal de l'entreprise"
request_data = {"messages": [{"role": "user", "content": sentence}]}
# Should still block (no exception bypass)
with pytest.raises(Exception) as exc_info:
await content_filter_guardrail.apply_guardrail(
inputs={"texts": [sentence]},
request_data=request_data,
input_type="request",
)
# Verify it was blocked
assert "blocked" in str(exc_info.value).lower()
@pytest.mark.asyncio
async def test_legitimate_game_context_allowed(self, content_filter_guardrail):
"""Test that legitimate game context with proper phrasing is allowed."""
sentence = "Détecter les émotions des joueurs dans un jeu vidéo"
request_data = {"messages": [{"role": "user", "content": sentence}]}
# Should allow (contains "dans un jeu" exception with proper context)
result = await content_filter_guardrail.apply_guardrail(
inputs={"texts": [sentence]},
request_data=request_data,
input_type="request",
)
assert result is None or result["texts"][0] == sentence
if __name__ == "__main__":
# Run tests with: pytest test_eu_ai_act_french_3_scenarios.py -v -s
pytest.main([__file__, "-v", "-s"])