パスワードを忘れた? アカウント作成
15342193 story
iPhone

iPhone の Wi-Fi を無効化する SSID のバグ、影響範囲が広がる 63

ストーリー by nagazou
ほかにも出てきそう 部門より
headless 曰く、

iPhone で SSID「%p%s%s%s%s%n」の Wi-Fi アクセスポイントに接続すると Wi-Fi 機能が無効化されるというバグが先日報告されたが、影響のある SSID はこの文字列に限定されないようだ(Mashable の記事)。

最初にバグを報告した Carl Schou (@vm_call) 氏は4日、SSID「%secretclub%power」のWi-FiアクセスポイントをホストすればすべてのiOSデバイスのWi-Fiを完全に無効化できると報告。最初のバグではネットワーク設定をリセットすれば回復していたが、こちらには効果がないという。

一方、このバグをAlex Skalozub (@pieceofsummer) 氏とともに調査していた Saif Eldeen Aziz (@wr3nchsr) 氏によると、フォーマット指定文字列に関する脆弱性であり、SSID に「%s」が含まれていれば特定の文字列である必要はないそうだ。Aziz 氏はネットワーク設定をリセットしても復旧しない理由として「%s」を含む SSID が複数保存されていることが原因となっている可能性を指摘する。問題のあるネットワークの SSID が保存された状態で wifid を開始しようとすると NULL ポインタデリファレンスが引き起こされ、wifid がクラッシュするとのこと。

Aziz 氏と Skalozub 氏が考案した修復方法は2種類。その一つは端末の初期化で、もう一つは iPhone のバックアップをいったん作成し、バックアップの既知のネットワークリストファイル (com.apple.wifi.known-networks.plist) から問題のエントリーを削除してから復元する方法だ。Schou 氏は後者の方法で修復できたという。Skalozub 氏は修復を実行する Python スクリプトを GitHub で公開している。

なお、Schou 氏の説明では悪意あるアクセスポイントのサービスエリア内に入るだけでWi-Fiが機能しなくなるようにも読めるが、Aziz 氏によれば悪意あるアクセスポイントを選択して接続しない限り問題は発生しないとのことだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by 90 (35300) on 2021年07月08日 12時36分 (#4066245) 日記

    素のprintfはともかく、その子分が長い歴史でchar[] string = sprintf(format, (in_str1, in_str2)); とかPython風の記法にならなかったのが謎。何故に副作用を持つのだ。

    • by Anonymous Coward

      Cではメモリの所有権の問題で難しいだろう。
      Javaは最初printfなしで頑張ってたが、結局要望が多かったんだろう、後から入れた(String.formatやSystem.out.printf)が、勿論Stringを返す形になってる。
      C++のSTLではprintfはない。ただ、現在ではboostにあり(boost::format)、std::stringを返す。

      SSIDの件は副作用でなく、可変個のパラメタの問題と考えられるので、あんまり関係ないが。

    • by Anonymous Coward

      上記の例だと関数がメモリ割り当ても行う必要ある?
      便利感とやりすぎでは感がある

      • え? 戻すStringのためのバッファはsprintf()のオブジェクトインスタンs……

        # 今更気づいたらしい

        親コメント
      • by Anonymous Coward

        strdup() [linuxjm.osdn.jp]

        • by 7743 (11762) on 2021年07月08日 17時03分 (#4066563)

          strdupは標準Cライブラリの関数じゃなかったような

          親コメント
        • by Anonymous Coward

          なるほど。

          C言語の中の人のことを正直わかってないのだが、ヘッダファイルで言うと
          sprintf - stdio.h
          malloc - stdlib.h
          strdup - string.h
          らしい。こことかで何かあるのだろうか。stdioはstdlibは使いたくないがstringは気にしないとか

          • by Anonymous Coward

            std**.h は Standard *** の略で昔からある基本機能、これを使うことに躊躇う理由は何もない
            とはいっても string.h を使うのを躊躇う理由も何もないけど、strdup は使わないかなぁ

            C 言語を使う理由の1つに「メモリ管理を隠蔽しない」というのがある
            関わる人全員が「strdup 内で malloc されていて、その戻り値は自分で free しないといけない」と分かっていれば良いけど、その前提は厳しい
            malloc したものは free する(あるいは相当するプロジェクト独自関数を使う)、とコーディングルールに定めておくと見通しが良くなります
            # なお私は自分で管理したくないので C++ 使います

            • by Anonymous Coward

              どもども。

              stdlib.h、適当に検索したらUNIX v7にstdlibはありませんか?とかいうStackoverflowの翻訳ぽい記事があって、89年ごろは
              環境によってあったりなかったりしたぽい。stdlib.hが無くてもmallocはあると思うけど。

              stdio.hは検索とかしてないけど、stdlib以前に成立してるなら、そのAPI設計は後年stdlibになる関数の依存を薄くすることは
              ありえると思う。sprintfが今の形になったのがそのためかはわからない

              • by Anonymous Coward

                ヘッダの成立はともかく、printf にしろ malloc にしろ K&R(ごく初期) の時点で存在する関数です
                sprintf が今の引数になっているのは、メモリをプログラマが管理する、という前提を守ったからではないでしょうか
                この引数だと書き込む先の領域がスタックでもヒープでもいいので、環境依存も減らせます
                # ヒープのないマイコンでも動かすために必要だし、と思ったけどそんな環境に sprintf なんて高機能な関数載ってないか……

              • by Anonymous Coward

                こんにちは。

                K&RC 2版が手元に残ってたんで(初版1989、手持ちは2000頃の版)見てみたけど、strdupも記載があるのはあるね。
                書きっぷりからユーザー定義関数ぽくて、サンプルプログラムとしてたまたまの登場か、当時の環境でも
                事実上の標準として存在したのかはちょっとわからないけど。

              • Arduinoにはsprintfありますね。

                Arduinoのプログラムって、uint8_t で十分なところにlongとか下手するとfloatを平気で使ったりして、
                8bitCPUに何させるの、と、貧乏性の自分には心臓に悪いコードが多いですけど、

                ヒープは一応あるけど容量厳しいので、動的メモリ確保(malloc や new)してるコードはほとんど見かけない。
                C++ベースだけどオブジェクトはグローバル変数として静的に定義するのが基本。

                親コメント
  • by Anonymous Coward on 2021年07月08日 12時13分 (#4066212)

    SSIDに「%s」が含まれるアクセスポイントを「悪意あるアクセスポイント」と呼ぶのは違和感がある。
    この話が明らかになってから新たに設定したのなら悪意の存在は明確だけど、知らずにバグを突いてしまった善意の第三者を「悪意ある」というのは言い過ぎでしょ。

    • by Anonymous Coward on 2021年07月08日 12時17分 (#4066218)

      規格上問題はないわけだから、おかしな実装をしたAppleの方こそ悪意があるのではないか。

      https://apple.srad.jp/comments.pl?sid=814769&cid=4056261 [apple.srad.jp]
      wikipediaには
      > 規格ではそのような制限はなく、SSIDは1から32オクテットの並びであって、各オクテットの値は任意である。

      親コメント
      • by Anonymous Coward on 2021年07月08日 12時27分 (#4066236)

        規格上問題はないわけだから、おかしな実装をしたAppleの方こそ悪意があるのではないか。

        「科学​者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、​プログラマ「えっ」

        親コメント
        • by Anonymous Coward

          今回はAppleの落ち度だが、
          例えばメールアドレスを厳密にRFCチェックすると途方もない処理になる
          実現できてるソフトはほぼ無いんじゃないかな

          • by Anonymous Coward on 2021年07月08日 18時23分 (#4066638)

            「落ち度」って言うより、純粋なバグだと思うよ。
            それも、かなり恥ずかしいレベルの。

                printf(ssid);

            みたいな明らかにまずいことを、どこかでやっているだけ。

            親コメント
          • by Anonymous Coward

            RFCに完璧に準拠してるわけじゃないという点は通じるものが有るけど、
            ばれないバグはバグじゃないという観点から見ると大きな差が有るな。
            落ち度として見えてしまったことが悪い。

          • by Anonymous Coward

            別に完璧な処理を書けというわけではなくて、踏んだときに発生する影響範囲が問題なわけですよ
            メールアドレスも弾くだけなら影響範囲は狭いですけど、今回だとサーバ自体が通信不能になるみたいな話で、それだったら大きな問題になるでしょ
            今回のも該当 SSID に接続できないぐらいだったら大きな問題にはならなかったけど、その後も引きずる大きな影響があったわけで
            何が言いたいって、例外処理は大事

        • by Anonymous Coward

          ぎゃあー!パーセント!エンガチョ!

        • by Anonymous Coward

          この元ネタってパヨク活動家の発言だったのを初めて知ったわ

          https://web.archive.org/web/20150414231624/https://www.asahi.com/artic... [archive.org]
          https://ja.wikipedia.org/wiki/%E6%95%91%E6%8F%B4%E9%8 [wikipedia.org]

    • by minet (45149) on 2021年07月08日 12時25分 (#4066233) 日記

      そのうち「ユニコードは犯罪」みたいなノリで「パーセントは犯罪」と言われそう…

      親コメント
      • by Anonymous Coward on 2021年07月08日 12時48分 (#4066266)

        Appleなら言う。間違いなく。言わないならそれはもうAppleではない。

        親コメント
        • by Anonymous Coward

          上位互換に見せかけて微妙に違う「iuNi code」とか生み出そう

    • Re: (スコア:0, 荒らし)

      by Anonymous Coward

      Appleに被害を与えてるんだ。
      この一点を持って悪意と認定して何がおかしいというのか。

      • by Anonymous Coward

        Apple「に」被害を与えてる??

      • by Anonymous Coward

        他人の庭の鍵で勝手に自爆しているだけに見えるが。

    • by Anonymous Coward

      ちゃんと「悪意ビット」を実装しておかないからこんなことになる。
      「悪意ビット」がONのアクセスポイントを「悪意あるアクセスポイント」と呼ぶなら何の問題もない。
      #悪意あるアクセスポイントがやり取りするパケットは悪意ビットを立てられるし

    • by Anonymous Coward

      知らずに「free_wifi_100%secure」みたいな名前を付けてしまう可能性がありますもんね

  • by Anonymous Coward on 2021年07月08日 12時08分 (#4066200)

    エスケープ漏れでやらかしてるんだから該当文字入っていればアウト
    今回は「恐らくそう」→「そうであることが確認できた」ってことと
    「復旧に使えるpyつくったった」て話かと

    # タイトルがいくない

  • by Anonymous Coward on 2021年07月08日 12時18分 (#4066222)

    NURO光が公開しているD-OUNの取扱説明書で、SSID名の説明が変更されていました。
    https://www.nuro.jp/pdf/device/manual_HG8045Q.pdf#page=58 [www.nuro.jp]

    発行 06、日付 2020-12-07

    タブ文字無しで、最大32文字から構成されます。

    発行 07、日付 2021-06-28

    表示可能なASCIIコードで構成されます。タブや特殊文字($,"\&|;`)は使用できません。

  • by Anonymous Coward on 2021年07月08日 12時46分 (#4066261)

    はバグだと思うけど、SSIDをそんなトリッキーな文字列に設定にする必要あるのかな?と。

    • by nekopon (1483) on 2021年07月08日 12時48分 (#4066269) 日記
      SSIDは文字列じゃなくオクテット列、という反論が来るぞ
      親コメント
      • by Anonymous Coward

        奥手な人の列???
        草食系の人の列だろうか?

      • by Anonymous Coward

        まぁ、SSIDがオクテット列という事も、そも、オクテット列が何かも分かってない、非アレゲなわけだけど。(面倒だろうから説明はいいよ)
        そんな複雑なのにする意味が、って事。長さも文字種も局所で識別するのにじゅうぶんだと思うんだけどね。

        • by Anonymous Coward

          規格としては人が見ることを条件とはしてないから、人が読めない文字だの画面で区別されな・表示されない文字だの使っていようと問題ない、という話やね

          でもそれはあくまで規格の話であって、現代では人が見て使い分けるためにあるようなものだから設定者はせめて見て区別できるような文字列設定しろよ、というのは全くもって正論

          (そもそもは人が読むことを要求してないから、コードとして01, 02, 03, ...って割り振ってもいいんだけど、それを人用のプログラムに通すとバグるんだ、という言い方の方が良いか?)

        • by Anonymous Coward

          制限しない方が規格としてはシンプル、実装は複雑ってところですね
          ただ(意図してはないと思いますが結果として)SSID に日本語とか使えるのは、この規格のお陰だと思いますよ
          # 日本語 SSID なんて使う気もないし繋ぎたくもないけど

          • by Anonymous Coward

            知らない人に気軽に繋がれないよう胡散臭いSSIDにしてます

    • by Anonymous Coward

      知らんけど、大量のAPをまとめて設定するスクリプト書いて、
      "%s"と間違えて'%s'って書いちゃったんじゃないかな。

    • by Anonymous Coward

      RFC違反のメールアドレスを見た目が面白いからと使ってた人はガラケー時代には結構いた
      というか今でも結構いるらしく、メールアドレスを使うサービスでRFC準拠のバリデーションが切るに切れないからこまるってマックで女子高生が言ってた

      #ACじゃなきゃ書けない

typodupeerror

※ただしPHPを除く -- あるAdmin

読み込み中...