Skip to content

Plantage lors du parsing (ValueError: No closing quotation) dû aux guillemets non échappés dans les retours de l'API #22

@DelityLuss

Description

@DelityLuss

Description du problème

Lorsqu'un vRouter Stormshield génère un warning lors d'une opération CONFIG FILTER RULE INSERT, son API XML peut renvoyer des attributs corrompus avec un guillemet (") collé en préfixe.

La fonction format_output() du client concatène ces clés sans les sécuriser ni les échapper, ce qui crée une ligne mal formattée. Ensuite, ConfigParser et shlex tentent de parser la ligne mais crashent (raise(e)) à cause des guillemets asymétriques, provoquant une interruption brutale du programme avant même la lecture de la validation pourtant renvoyée par le pare-feu (100 Ok).

Retour XML brut du pare-feu

Voici le retour XML obtenu lors de l'insertion d'une règle :

<section title="Check">
  <line>
      <key name="slot" value="local_filter_slot"/><key name="type" value="warning"/><key name="code" value="148"/>
  </line>
  <line>
      <key name="&quot; causedby_element_code" value="44"/>
      <key name="causedby_element" value="destination if"/>
      <key name="causedby_value" value="INTERCO-PUB"/>
  </line>
</section>

Une fois converti par la méthode format_output du sslclient, cela donne :
" causedby_element_code=44 causedby_element="destination if" causedby_value=INTERCO-PUB

Lorsque shlex traite cette ligne, il trouve 3 guillemets. Il plante alors sur l'erreur fatale non-gérée : ValueError: No closing quotation.

Correction

  1. Échappement propre (sslclient/__init__.py) : Il faut parser ou stripper plus finement le format .ini construit à partir du XML dans la méthode format_output pour enlever ces guillemets résiduels ou rajouter un échappement à key_node.get('name') et serverd_node.get('msg').
  2. Ignorer le crash de configparser (sns/configparser.py) : Remplacer l'exception fatale de ce bloc par un avertissement non bloquant.
 except Exception as e:
      # Remplacement silencieux pour ne pas perdre la session TCP
      import logging
      logging.getLogger(__name__).warning("Can't natively shlex the line: %s, error was: %s", line, str(e))
      # raise(e)  <- à de base ceci fait tout crasher

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions