Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

MySQL query timeout Denial of Service

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Dica MySQL query timeout Denial of Service

    Devido a falta de um tempo limite de execução (query timeout) para consultas, é possível fazer com que o MySQL fique por um determinado tempo (horas/dias) processando uma query específica. O tempo de processamento vai depender dos recursos de hardware (cpu, memória…) disponíveis no servidor.

    O MySQL possui uma variável de sistema, que define a quantidade máxima de conexões que podem ser realizadas simultaneamente (max_user_connections) para o deamon. Por exemplo no caso desta variável estar configurada para –max_user_connectons=100, o MySQL apenas irá permitir que 100 conexões simultâneas sejam processadas, no caso de uma tentativa de conexão 101 for realizada, o deamon irá responder com a mensagem Too many connections e desta forma nenhuma outra requisição será processada enquanto as conexões estiverem ativas.

    A função benchmark() pode ser utilizada para “segurar” uma determinada conexão por um certo intervalo de tempo. Por exemplo:.

    Código:
     	mysql> select benchmark(500000,sha1('A'));
     	+------------------------------+
     	| benchmark(500000,sha1(0x65)) |
     	+------------------------------+
     	|                            0 |
     	+------------------------------+
     	1 row in set (1.11 sec)
    Ao executar a função benchmark(), conforme ilustrado, é possível verificar que o MySQL levou cerca de 1.11 segundos para processar a query, ou seja, ele “segurou” a conexão atual por um período de 1.11 segudos. Se o valor referente a quantidade de vezes de processamneto da função benchmark(), for aumentado, o tempo total de processamento consequentemente aumenta.

    Código:
    	mysql> select benchmark(500000000,sha1(0x65));
    	+---------------------------------+
    	| benchmark(500000000,sha1(0x65)) |
    	+---------------------------------+
    	|                               0 |
    	+---------------------------------+
    	1 row in set (12 min 5.06 sec)
    O processamento da função benchmark() acima, levou 12 minutos para ser processada.

    Como esta função não possui limites para a quantidade de vezes necessária para processar determinada tarefa, é possível incrementar este número para um valor extremamente alto de forma que uma ou mais conexões disponíveis seja ocupada por um longo período de tempo.

    Através deste comportamento, é possível causar uma negação de serviço, bastando enviar múltiplas requisições de conexões simultâneas, de forma a preencher todos os slots disponíveis no MySQL (definidas no max_user_connections) e manter estas conexões ocupadas com o processamento do benchmark(). Desta forma conexões subseqüente não serão processadas pelo deamon.

    Para forçar o MySQL a processar uma requisição por várias horas/dias, a seguinte query pode ser enviada:

    Código:
    	 select benchmark(9000000000000000000000000000000,ENCODE(0x65,0x65))
    A função nativa ENCODE() leva cerca de 4 vezes mais tempo para ser processada do que a função sha1(), logo pode ser utilizada para “segurar” as conexões do MySQL.

    Durante os testes realizados no daemon, foi possível notar que o processamento da CPU mantia-se em média de 98%, além de que novas conexões ao banco eram negadas. Para restabelecer o funcionamento normal do daemon foi necessário restartar o MySQL.

    Fonte: tiagoferreira
    Similar Threads
X
Working...
X