caracteres de escape em / etc / network / interfaces

8

Eu quero ter certeza de que qualquer string eu passar para a linha wpa-ssid "abc"em /etc/network/interfacesnão vai ser usado para sair da configuração.

Tudo o que posso encontrar no manual é que \pode ser usado no final de uma linha para continuar na próxima linha.

Mas e \"no meio de uma linha?

Minhas preocupações é um SSID algo como

A"
up rm -rf /\

Existe alguma codificação geral que possa ser usada para caracteres arbitrários no campo SSID?

hultqvist
fonte

Respostas:

5

No Debian /etc/network/interfaces(ou em qualquer outra distribuição usando o utilitário ifupdown do Debian), uma sequência de barra invertida-nova linha é removida e a barra invertida não é especial em nenhum outro lugar. Um caractere de aspas duplas também não é especial. O caractere #inicia um comentário se for o primeiro caractere sem espaço em branco em uma linha (sem continuação). Bytes nulos são tratados como caracteres de nova linha (eu acho - o analisador usa cadeias C e não possui tratamento especial para bytes nulos, portanto, eles podem causar danos adicionais).

As linhas de configuração assumem a forma de um nome de opção seguido por um valor, separado por espaços em branco. Os espaços em branco à esquerda e à direita são ignorados. Algumas opções internas analisam ainda mais a linha em palavras; o valor das opções para ifacesempre é executado até o final da linha.

Por exemplo, a linha

wpa-ssid  "a  b"  "cd"  

define a opção wpa-ssidpara a cadeia de 12 caracteres "a  b"  "cd"(o espaço em branco interno é preservado).

O script ifupdown do WPA Supplicant retira aspas duplas no início e no final da wpa-ssidsequência de configuração, a linha acima é equivalente a wpa-ssid a  b"  "cd. Dessa forma, você pode ter espaços em branco à esquerda e à esquerda no SSID.

Não consigo encontrar um problema de citação nos scripts ifupdown do WPA Supplicant, portanto, parece que tudo o que o ifupdown produzirá é seguro.

Assim, você pode permitir que qualquer sequência como um SSID seja injetada /etc/network/interfaces, desde que não contenha nenhuma nova linha ou byte nulo. Adicione aspas duplas ao redor da string (se não o fizer, os SSIDs com espaços em branco à esquerda ou à direita, ou que terminem com \, ou que comecem ou terminem ", serão mutilados).

Gilles 'SO- parar de ser mau'
fonte
Na verdade, eu tentei com sucesso wpa-ssid my ssid.
Hultqvist
@phq - para ser claro, você conseguiu usar a linha wpa-ssid=my ssid?
slm
@ slm não, /etc/network/interfacesnão usa =em sua sintaxe, tentei agora e não funciona =.
Hultqvist
@phq - mas ao seu ponto, você conseguiu atribuir um SSID com espaços, então? my ssid?
slm
@slm sim SSID com espaços sempre trabalhou
Hultqvist
0

Esta sessão de perguntas e respostas da SO intitulada: Existe um padrão que define o que é um SSID e senha válidos? responde a algumas de suas perguntas.

excerto

A seção 7.3.2.1 da especificação 802.11-2007 ( http://standards.ieee.org/getieee802/download/802.11-2007.pdf ) define SSIDs.

Um SSID válido é de 0 a 32 octetos com conteúdo arbitrário. Um SSID de comprimento 0 indica o SSID curinga (em quadros de solicitação de análise, por exemplo).

Não há um conjunto de caracteres associado ao SSID - uma seqüência de 32 bytes de NUL-bytes é um SSID válido.

Isso implica:

  • você nunca deve usar funções normais de string ao manipular SSIDs genéricos (strcpy () e amigos).
  • você não deve assumir que o SSID é imprimível ao, por exemplo, registrá-lo no disco

Há também este comentário na resposta à pergunta SO:

Há uma versão atualizada do padrão ( http://standards.ieee.org/getieee802/download/802.11-2012.pdf ), que define o SSIDEncodingcampo. Pode ser UNSPECIFIED(para dados arbitrários) ou UTF8.

Então, eu procuraria o padrão mais recente para obter orientação e garantir que você possa lidar com o que é legal com base nisso.

O quê mais?

Além disso, posso estar inclinado a me proteger normalizando a entrada de um usuário usando alguma forma de função de codificação de URL (algo que funcionaria com os SSIDs obviamente) ou simplesmente remover caracteres ilegais e simplesmente não permitir que eles antes de escrever essas strings neste arquivo .

Personagens estranhos?

Os únicos problemas que eu pude encontrar com caracteres estranhos / especiais relacionados ao interfacesarquivo foram esses tipos de bugs que foram arquivados no debian-installer.

O debian-installer solicitou minhas informações de rede sem fio e a usou com sucesso para conectar-se sem fio à rede. Ele também escreveu minhas informações de rede sem fio em / etc / network / interfaces. No entanto, a chave WPA que eu inseri continha pelo menos um caractere especial, e o debian-installer não escapou ou citou os caracteres especiais em / etc / network / interfaces. O resultado foi que, na reinicialização, o sistema travou por muito tempo durante o processo de inicialização, enquanto tentava (sem êxito) reconectar-se à rede sem fio. Corrigi o problema simplesmente citando a chave WPA listada em / etc / network / interfaces. Isso deve acontecer automaticamente se a chave contiver caracteres especiais.

Também havia esses bugs, um relacionado a espaços no SSID, os outros relacionados à senha:

Em ambos os casos, parece que agrupar as cadeias com aspas duplas é suficiente para proteger os valores de ambas.

Exemplos adicionais

Documentos oficiais

Pesquisando a documentação oficial, encontrei este trecho aqui:

Os documentos oficiais mostram este exemplo:

ap_scan=2
network={
        ssid="test adhoc"
        mode=1
        frequency=2412
        proto=WPA
        key_mgmt=WPA-NONE
        pairwise=NONE
        group=TKIP
        psk="passphrase"
}

Portanto, parece que os espaços são permitidos, desde que sejam citados corretamente. Também há este exemplo explicando como fornecer um SSID com espaços para a iwconfigferramenta:

Adicione o nome (ssid) à rede que você deseja criar / ingressar. Use aspas simples se houver um espaço no nome.

   $ sudo iwconfig eth1 essid 'name'

Webconverger

Eu encontrei este exemplo que parece ser o Debian, então o exemplo pode ser apropriado à sua situação, mas é difícil dizer com certeza. Apresento isso apenas porque mostra um exemplo de como eu esperaria que um método de codificação de URI fosse exposto para proteger contra caracteres ilegais.

excerto

Exemplo 4 "Espaços no ESSID", transmitindo o essid 'Hopstock Gjestenett', com a chave WPA uiopzxcv

Evite espaços nos ESSIDs. Nesse caso, contornamos um encodeURI ('Hopstock Gjestenett'), para obter a seguinte receita de inicialização:

   wpa-ssid=Hopstock%20Gjestenett wpa-psk=uiopzxcv

Portanto, você poderá codificar os espaços que aparecem nos SSIDs usando %20.

SSIDs

Aprofundando ainda mais, encontrei esse comentário na página da Wikipedia no conjunto de serviços (rede 802.11) .

Cada BSS ou ESS é identificado por um identificador de conjunto de serviços (SSID) - uma sequência de 1 a 32 bytes. Normalmente, é uma string legível por humanos e, portanto, comumente chamada de "nome da rede". 6 Em um IBSS, o SSID é escolhido pelo dispositivo cliente que inicia a rede e a transmissão do SSID é realizada em uma ordem pseudo-aleatória por todos os dispositivos que são membros da rede.

Este comentário é apoiado por esta apresentação da Blackhat EU 2013, intitulada: Exploração prática usando um identificador de conjunto de serviços maliciosos (SSID) .

excerto

  • Nenhuma restrição definida sobre quais caracteres podem ser usados ​​em um SSID (IEEE Std 802.11 ™ -2012)
  • Alguma limitação baseada em produtos
    • Alguma limitação de caracteres (apenas ascii)
    • Unicode

Portanto, tecnicamente, qualquer caractere é permitido em um SSID, diferentes implementações, como Windows XP, Windows 7, vs. várias versões do Linux, permitem / não permitem subconjuntos de caracteres nos SSIDs.

Referências

slm
fonte
1
Sua resposta não chega ao ponto: em que escape está disponível /etc/network/interfaces?
Gilles 'SO- stop be evil'
@ Gilles - obrigado, foi um começo hoje mais cedo no trabalho, adicionei algumas informações adicionais que eu havia encontrado, mas não adicionei ao A então. Principalmente erros relacionados ao escape de caracteres para "wpa-ssid" e "wpa-psk".
slm
Eu não posso dizer se urlencoding o essid funciona como um parâmetro de inicialização, mas não funciona no arquivo de interfaces.
Hultqvist
@phq - Não estou surpreso, isso foi apenas uma ideia, e a codificação geralmente é a maneira como você lida com dados higienizados como esse em outros aplicativos, citando que parece ser a única outra opção, além de removê-lo.
slm