SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶ脆弱性対策コーディング

Samba smbclient―書式指定文字列に潜む脆弱性

実例で学ぶ脆弱性対策コーディング 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

コードの説明

 Sambaのクライアントプログラムsmbclientは、コマンドラインインターフェイスのプログラムです。ftpコマンドと同様なもの、と言えば大体想像のつく方も多いのではないでしょうか。サービス名を引数に指定して起動するとそのサービスを提供するサーバーに接続し、プロンプトが出てきます。それに対してコマンドを入力していくことで、ファイルのアップロードやダウンロード、ディレクトリ操作などを行うものです。

 各コマンドに対応してその処理を行う関数が定義されており、getコマンドに対応する関数がcmd_get()です。ユーザーがプロンプトに対して「get filename」と入力すると、サーバー上の「filename」というファイルをダウンロードしますが、実際の処理はこのcmd_get()関数のなかで行われています。

 cmd_get()の処理を上から順番に見ていきましょう。

  • talloc_strdup()でサーバ側のカレントディレクトリを取得
  • next_token_talloc()でgetコマンドの引数に指定されたファイル名を取り出す
  • talloc_asprintf_append()を使ってディレクトリ名とファイル名を連結したパスを表す文字列を生成
  • clean_name()で、パス名のなかに".."などが含まれているときはそれを含まない形に直す
  • next_token_talloc()でダウンロードしてきたファイルを保存するときに使うローカル側のファイル名を取り出す(指定されていなければリモート側でのファイル名をそのまま使う)
  • 最後にdo_get()で、ファイルをダウンロードして保存して終了

 「talloc」という文字列を含む関数がいくつか出てきますが、これはSambaで使われている動的メモリ管理ライブラリtallocのなかの関数です。Sambaではパス名やサービス名などの文字列の操作が頻繁に行われますが、それらを動的メモリ領域に置いて管理しています。malloc()やfree()などのC標準ライブラリ関数を直接使うとメモリ管理が繁雑になるため、不要になったメモリ領域をある程度自動的に解放できる仕組みをtallocライブラリ(trivial alloc)として実装して使っているのです。今ではこのtallocライブラリはSambaとは独立に公開されていますので、興味のある方はどのように実装されているか調べてみてください。

 今回のコードでは、tallocライブラリの詳細まで知っている必要はありません。使われている関数の働きとその型情報を知っていれば、アヤシイ部分に気付くことができます。いかがでしょうか。どこに問題があるか見つけられましたか?

次のページ
コードに潜む脆弱性の解説

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
実例で学ぶ脆弱性対策コーディング連載記事一覧

もっと読む

この記事の著者

戸田 洋三(JPCERT コーディネーションセンター)(トダ ヨウゾウ(JPCERT コーディネーションセンター))

リードアナリストJPCERTコーディネーションセンター東京工業大学情報理工学研究科修士課程修了。学生時代は、型理論および証明からのプログラム抽出を研究。その後、千葉大学総合情報処理センターのスタッフとして、学内ネットワークの運営、地域ネットワーク、IPマルチキャストの実験ネットワークであるJP-MB...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5229 2010/06/22 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング