¿Es seguro usar flex y bison como un analizador de protocolo?

1

Comencé a escribir un simple lexer y analizador de protocolo para STOMP usando flex y bison. ¿Alguien sabe de algún problema de seguridad que pueda resultar de esto?

Editar: Código añadido.

%{
 /* Tokenizer for the STOMP 1.2 protocol. */
%}

%%
 /* Client commands. */
"SEND"                          return T_CLIENT_SEND;
"SUBSCRIBE"                     return T_CLIENT_SUBSCRIBE;
"UNSUBSCRIBE"                   return T_CLIENT_UNSUBSCRIBE;
"BEGIN"                         return T_CLIENT_BEGIN;
"COMMIT"                        return T_CLIENT_COMMIT;
"ABORT"                         return T_CLIENT_ABORT;
"ACK"                           return T_CLIENT_ACK;
"NACK"                          return T_CLIENT_NACK;
"DISCONNECT"                    return T_CLIENT_DISCONNECT;
"CONNECT"                       return T_CLIENT_CONNECT;
"STOMP"                         return T_CLIENT_STOMP;

 /* Server Commands. */
"CONNECTED"                     return T_SERVER_CONNECTED;
"MESSAGE"                       return T_SERVER_MESSAGE;
"RECEIPT"                       return T_SERVER_RECEIPT;
"ERROR"                         return T_SERVER_ERROR;

 /* Other tokens */
\x00                            return T_NULL;
\x0A                            return T_LF;
\x0D                            return T_CR;
[\x0D]?\x0A                     return T_EOL;
:                               return T_COLON;
[0-255]                         return T_OCTET;
 /* (T_OCTET - (T_LF + T_CR + T_COLON)) */
[\x00-\x09\x0B-\x0C\x0E-\xFF]   return T_SPECIAL;

%%
%{
 /* Parser for the STOMP 1.2 protocol. */
 #include <stdio.h>
 #include "../client_protocol_stomp.h"

 extern stomp_node_t stomp_frame_root;

 void yyerror(const char *str) {
     fprintf(stderr,"error: %s\n",str);
 }

 int yywrap() {
     return 1;
 }

 int yylex(void);
%}

%defines
%error-verbose

/* Tokens for header file generation. */
%token T_CLIENT_SEND T_CLIENT_SUBSCRIBE T_CLIENT_UNSUBSCRIBE T_CLIENT_BEGIN
%token T_CLIENT_COMMIT T_CLIENT_ABORT T_CLIENT_ACK T_CLIENT_NACK
%token T_CLIENT_DISCONNECT T_CLIENT_CONNECT T_CLIENT_STOMP T_SERVER_CONNECTED
%token T_SERVER_MESSAGE T_SERVER_RECEIPT T_SERVER_ERROR T_NULL T_LF T_CR T_EOL
%token T_COLON T_OCTET T_SPECIAL

%union {
    stomp_node_t node;
}

/* Map tokens and non-terminals to fiels in the yylval union. */
/* %type <node> factor term exp */

%%
expression     : frame { /* stomp_frame_root = $1; */ }
               ;

frame          : frame_command
                 frame_command
                 T_EOL
                 frame_octet
                 T_NULL
                 frame_eol
               ;

frame_command  : command T_EOL
               ;

frame_header   : header T_EOL
               | header T_EOL frame_header
               ;

frame_octet    : T_OCTET
               | T_OCTET frame_octet
               ;

frame_eol      : T_EOL
               | T_EOL frame_eol
               ;

command        : client_command 
               | server_command
               ;

client_command : T_CLIENT_SEND
               | T_CLIENT_SUBSCRIBE
               | T_CLIENT_UNSUBSCRIBE
               | T_CLIENT_BEGIN
               | T_CLIENT_COMMIT
               | T_CLIENT_ABORT
               | T_CLIENT_ACK
               | T_CLIENT_NACK
               | T_CLIENT_DISCONNECT
               | T_CLIENT_CONNECT
               | T_CLIENT_STOMP
               ;

server_command : T_SERVER_CONNECTED
               | T_SERVER_MESSAGE
               | T_SERVER_RECEIPT
               | T_SERVER_ERROR
               ;

header         : header_name T_COLON header_value
               ;

header_name    : T_SPECIAL
               ;

header_value   : header_name
               | header_name header_value
               ;
%%
    
pregunta Jon Bringhurst 08.02.2013 - 17:20
fuente

1 respuesta

5

Bison y flex son herramientas razonables para escribir analizadores para protocolos que encajan en una gramática LALR (1); pero son solo herramientas como, por ejemplo, un compilador de C. Todavía depende de ti no hacer nada malo con ellos. De hecho, bison y flex significan que está a punto de implementar su código con C o C ++, lenguajes que se sabe que son difíciles de manejar correctamente y propensos a desencadenar agujeros de seguridad, especialmente debido a problemas de asignación de alias de punteros, falta de administración manual de memoria. de instalaciones de manejo de cadenas de caracteres decentes, y límites de matriz sin marcar. Estos son problemas de C, no de bisonte, pero de todos modos los obtendrás.

El análisis de LALR (1) puede ser un poco confuso porque tiende a obtener las reglas de "reducción" de derecha a izquierda. Cuando escribes el código adjunto a las cláusulas gramaticales, esto puede hacer que las cosas sean incómodas (tienes que manejar las hojas del árbol de sintaxis que es una forma casi libre de contexto).

Lo bueno de flex y bison es que son sistemáticos: implementarán todos los casos de la esquina de la gramática. Esa es una gran propiedad para la seguridad (la mayoría de la codificación segura trata de cubrir todos los casos posibles sin olvidar ninguno).

    
respondido por el Thomas Pornin 08.02.2013 - 18:38
fuente

Lea otras preguntas en las etiquetas