web-dev-qa-db-ja.com

/ etc / network / interfacesのエスケープ文字

wpa-ssid "abc"の行/etc/network/interfacesに渡す文字列は、構成を解除するために使用しないようにしたいと思います。

マニュアルで見つけることができるのは、\を行末で使用して次の行に続けることができることだけです。

しかし、行の真ん中にある\"はどうでしょうか。

私の心配はSSIDのようなものです

A"
up rm -rf /\

SSIDフィールドの任意の文字に使用できる一般的なエンコーディングはありますか?

8
hultqvist

Debianの/etc/network/interfaces(またはDebianのifupdownユーティリティを使用するその他のディストリビューション)では、バックスラッシュと改行のシーケンスが削除されており、バックスラッシュは他のどこにも特別なものではありません。二重引用符も特別ではありません。文字#は、(継続ではない)行の最初の非空白文字の場合、コメントを開始します。 nullバイトは改行文字として扱われます(パーサーはC文字列を使用し、nullバイトに対する特別な処理がないため、さらに悪影響を及ぼす可能性があります)。

構成行は、空白で区切られたオプション名とそれに続く値の形式を取ります。先頭と末尾の空白は無視されます。一部の組み込みオプションは、行をさらに解析して単語にします。 ifaceのオプションの値は常に行末まで続きます。

たとえば、行

wpa-ssid  "a  b"  "cd"  

オプションwpa-ssidを12文字の文字列"a  b"  "cd"に設定します(内部の空白は保持されます)。

WPAサプリカントのifupdownスクリプトは、wpa-ssid構成文字列の最初と最後の二重引用符を取り除きます。上の行はwpa-ssid a  b"  "cdと同等です。このようにして、SSIDに先頭と末尾の空白を含めることができます。

WPAサプリカントのifupdownスクリプトで引用の問題を見つけることができないため、ifupdownが生成するものは安全であるように見えます。

したがって、改行やnullバイトが含まれていない場合は、SSIDとして任意の文字列を/etc/network/interfacesに挿入できます。文字列を二重引用符で囲みます(追加しない場合、先頭または末尾に空白がある、または\で終わる、または"で終わるまたはSSIDがマングルされます)。

これは、SO Q&Aタイトル: 有効なSSIDとパスワードとは何かを定義する標準はありますか? は、いくつかの質問に答えます。

抜粋

802.11-2007仕様のセクション7.3.2.1( http://standards.ieee.org/getieee802/download/802.11-2007.pdf )は、SSIDを定義しています。

有効なSSIDは、任意の内容の0〜32オクテットです。長さ0のSSIDは、ワイルドカードSSIDを示します(プローブ要求フレーム内など)。

SSIDに関連付けられた文字セットはありません。32バイトのNULバイトの文字列が有効なSSIDです。

これは以下を意味します:

  • 汎用SSID(strcpy()およびその仲間)を操作するときは、通常の文字列関数を使用しないでください。
  • たとえば、ディスクにログを記録するときに、SSIDが印刷可能であると想定しないでください。

SO質問への回答に関するこのコメントもあります:

標準の更新バージョン( http://standards.ieee.org/getieee802/download/802.11-2012.pdf )があり、SSIDEncodingフィールドを定義しています。 UNSPECIFIED(任意のデータの場合)またはUTF8を使用できます。

ですから、私は最新のガイダンス基準を検討し、それに基づいて合法的なものに対処できるようにします。

ほかに何か?

さらに、何らかの形式のURLエンコード関数(SSIDで明らかに機能するもの)を使用してユーザーの入力を正規化するか、不正な文字を単に削除し、これらの文字列をこのファイルに書き込む前に許可しないようにして、自分を守ろうと思うかもしれません。

変なキャラクター?

interfacesファイルに関連する奇妙な特殊文字で見つけられる唯一の問題は、debian-installerに対して提出されたこれらのタイプのバグでした。

debian-installerは私の無線ネットワーク情報を尋ね、それを無線でネットワークに接続するのに成功しました。また、私のワイヤレスネットワーキング情報を/ etc/network/interfacesに書き込みました。しかし、入力したWPAキーには少なくとも1つの特殊文字が含まれており、debian-installerは/ etc/network/interfaces内の特殊文字をエスケープまたは引用しませんでした。結果は再起動時に、ワイヤレスネットワークへの再接続を(失敗して)試みたため、システムは起動プロセス中に非常に長い時間ハングしました。WPA/etc/network/interfacesにリストされているキーキーに特殊文字が含まれている場合、これは自動的に行われます。

また、SSID内のスペースに関連するバグとパスフレーズに関連するバグがありました。

どちらの場合も、文字列を二重引用符で囲むことで、両方の値を保護できます。

追加の例

公式ドキュメント

ここでこのビットを見つけた公式ドキュメントを掘り下げます:

公式ドキュメントはこの例を示しています:

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

したがって、スペースが正しく引用されている限り、スペースが許可されているように見えます。また、スペースを含むSSIDをiwconfigツールに提供する方法を説明する次の例もあります。

作成/参加するネットワークの名前(ssid)を追加します。名前にスペースが含まれている場合は、単一引用符を使用してください。

   $ Sudo iwconfig eth1 essid 'name'

Webconverger

私はこの例が内部でDebianのように見えることを見つけたので、この例はあなたの状況に適しているかもしれませんが、確実に伝えるのは困難です。これは、不正な文字から保護するためにURIエンコーディングメソッドがどのように公開されることを期待しているかの例を示しているためです。

抜粋

例4「ESSIDのスペース」、essid 'Hopstock Gjestenett'をWPA key uiopzxcv

ESSIDにはスペースを入れないでください。この場合、encodeURI( 'Hopstock Gjestenett')を使用して次のブートレシピを取得します。

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

したがって、%20を使用して、SSIDに表示されるスペースをエンコードできる場合があります。

SSID

さらに深く掘り下げる Service set(802.11 network) のWikipediaページからこのコメントを見つけました。

各BSSまたはESSは、1〜32バイトの文字列であるサービスセット識別子(SSID)によって識別されます。これは通常人間が読める文字列であるため、一般的に「ネットワーク名」と呼ばれます。 6 IBSSでは、ネットワークを開始するクライアントデバイスによってSSIDが選択され、SSIDのブロードキャストが実行されますネットワークのメンバーであるすべてのデバイスによる疑似ランダムな順序で。

このコメントは、Blackhat EU 2013の次のタイトルのプレゼンテーションで裏付けられています: 悪意のあるサービスセット識別子(SSID)を使用した実用的な悪用

抜粋

  • SSID内で使用できる文字に関する定義された制限はありません(IEEE Std 802.11™-2012)
  • 製品に基づくいくつかの制限
    • 一部の文字制限(ASCIIのみ)
    • Unicode

したがって、技術的にはSSIDで任意の文字を使用できます。WindowsXP、Windows 7などのさまざまな実装と、さまざまなLinuxバージョンでは、SSID内の文字のサブセットを許可または禁止します。

参考文献

0
slm