OAuth徹底入門の読書感想文 -10章-

OAuth徹底入門を読んだので感想と概要を書いていきます

www.shoeisha.co.jp

9章については先日書きました

zwzw.hatenablog.com

今回は10章についてです

10章 よく狙われるOAuthトークンの脆弱性

Bearerトークンとは

OAuth2.0ではBearerトークンをセキュリティを担保する仕組みとして使う

Bearerトークンはトークンの所有者が誰であれ、そのトークンをリソースへのアクセスのために使用することができる

(ちなみにBearerとは持参者とかいった意味)

OAuthのBearerトークンに関した脅威には以下のものがある

  • トークンの偽造 (Token Forgery)
    • 攻撃者が地震の偽のトークンを作成したり既存の有効なトークンを改ざんしたりすることで、リソース・サーバーがクライアントに対して不適切なアクセスを許可させてしまう
  • トークンのリプレイ (Token Replay)
    • 攻撃者がトークンの有効期限がきれてしばらく経ってから再利用しようとしてくる場合がある。リソース・サーバーはその際エラーを返さなければならない
  • トークンの流用 (Token Redirect)
    • 攻撃者はあるリソース・サーバーで生成されたトークンを別のリソース・サーバーへ送信する場合がある
  • トークンからの漏洩 (Token Disclosure)
    • トークンはシステムに関する機密情報を含んでいることがある、攻撃者に情報を見られてしまう場合がある

Bearerトークンをどのように保護するか

  • 安全ではないチャネル場で送らせない
    • SSL/TLSのように気密性を端から端まで保てる方法を使って保護する
  • クライアント側ではトークンのもつスコープを必要最低限に絞っておく
  • 認可サーバーではアクセストークンをハッシュ値でもつ、トークンの有効期限を短くする
  • 保護対象リソースではトークンをログに残さない、なんでもできるような特別なアクセストークンを使用しない

感想

ついにBearerの意味がわかった (調べろって話なんだが、、)

トークン自体はただ保護対象リソースに提示されるものなので、7、8、9章で説明されてたクライアントや認可サーバーや保護対象リソースがどのようにトークンを守るかという話とかぶる部分は多かった

OAuth徹底入門の読書感想文 -9章-

OAuth徹底入門を読んだので感想と概要を書いていきます

www.shoeisha.co.jp

8章については先日書きました

zwzw.hatenablog.com

今回は9章についてです

9章 よく狙われる認可サーバーの脆弱性

認可サーバーはOAuthの構成要素の中でも最も複雑

ユーザーとのやりとりを行うWebサイトと、マシンとのやりとりを行うAPIの両方を提供しており、以下に述べるような一般的なセキュリティがまず求められる

  • サーバーのログを安全にする (クレデンシャルなどをログに出さない)
  • TLSを有効な証明書と共に使う
  • 適切なアカウントのアクセス制御をする

また、OAuthにおける認可サーバーとしては以下のことに気をつける必要があります

セッションの乗っ取り

問題

認可コードによる付与 (Authorization Code Grant)を行なっている認可サーバーの場合、認可サーバーは生成した認可コードをURIのリクエスト・パラメータに含め、リダイレクトを使ってそれをクライアントへ運ぶようにする

この際、認可コードはブラウザを経由してクライアントへ運ばれるため、ブラウザ履歴に残ってしまう

もし共用のパソコンで作業をしていた場合、たとえ自分は作業が終わった段階でログアウトしても後からきた悪意あるユーザーが自分のID、パスワードでログインし、履歴に残っていた認可コードを使って認可サーバーへ注入したとすると、最初に認可コードを取得したリソース所有者のリソースにアクセスできるようになってしまう

対策

OAuthの仕様ではこうした自体を防ぐため、一度認可コードがトークンとの交換に使用されたらその場で認可コードを削除するようにしている

そうすることで、認可コードは認可サーバーに一度しか受け入れられなくなる

リダイレクトURIの不正操作

問題

OAuthではredirect_uriの検証方法については完全に認可サーバーに一任されている

認可サーバーは一般的に3つの検証アルゴリズム (完全一致、サブディレクトリの許可、サブドメインの許可)のどれかを使ってredirect_uriの検証を行う

サブディレクトリやサブドメインを許可していると、もし攻撃者がクライアント・サーバー内に悪意あるページを作成できた場合、redirect_uriを操作して認可コードやアクセストークンを持ったままユーザーを攻撃者の悪意あるページにリダイレクトすることができてしまう

対策

とてもシンプルだが、認可サーバーが利用すべき唯一の安全なredirect_uriの検証方法は完全一致である

オープン・リダイレクトによる脆弱性

問題

オープン・リダイレクトとは未検証のリンクへリダイレクトしてしまうことで悪意あるページにユーザーを遷移させてしまう脆弱性

たとえば、攻撃者が新しいクライアントを認可サーバーへ登録し、redirect_uriを以下のような特殊なものにしておく

https://hogehoge/fugafuga/authorize?response_type=code?client_id=attcker-client-id&scope=WRONG_SCOPE&redirect_uri=https://attacker.com

攻撃者はこのような不正な認証を行うリクエストのURIを作成しておくことで、正当なクライアントを攻撃者のサーバーにリダイレクトすることができる

対策

リクエストの処理でエラーが起こった際はリダイレクトするのではなく、400 Bad Requestを返すことでオープン・リダイレクトによる脆弱性をなくすことができる

感想

ちょっと難しかった

攻撃者、攻撃者のサーバー、攻撃者のクライアント、ユーザー、クライアント、認可サーバーなど登場する役が多いのでちょっと自分の頭の中でも整理しきれてない感じはする

ただやらなきゃいけないことはシンプルで明白なので実装時には心がけていこう

OAuth徹底入門の読書感想文 -8章-

OAuth徹底入門を読んだので感想と概要を書いていきます

www.shoeisha.co.jp

7章については先日書きました

zwzw.hatenablog.com

8章 よく狙われる保護対象リソースの脆弱性

この章ではどのようにリソース・サーバーを保護し、OAuthの保護対象リソースを対象とした攻撃からどのように守るかについて説明されています

保護対象リソースの脆弱性とは

最も明白なものはアクセストークンの漏洩

そのほかにもエンドポイントへのXSSなどがある

XSSへの対策

エンドポイントへのXSSを防ぐには

  • ユーザーの入力を直接レスポンスに含むなど、信頼できないレスポンスを返す場合は全てサニタイズする
  • ブラウザの提供する保護の仕組みを利用する
    • X-Content-Type-Option: ブラウザが宣言したContent-Typeとは異なるレスポンスのMIMEを自動的に判別することを防ぐ
    • X-XSS-Protection: ブラウザが自動的にXSS攻撃を除外する

トークンのリプレイ攻撃への対策

アクセストークンが漏洩した場合、有効期限を短く設定しておけば被害を最小限にすることができる

また、OAuthでは様々な通信にTLSが使用されていることが前提とされている

HTTPの仕組みの一つであるHSTSを使用することで、HTTPSでの通信を使用することをサーバー側から指定することができる

感想

保護対象リソースはOAuthにおける役割も割とシンプルなので、セキュリティ面でもやることは少ない (レスポンスでXSSに気をつける、通信はTLSを使用するなど)と思った

ただ保護対象リソースに脆弱性があるとOAuthで頑張ってセキュアにしてもなんの意味もなくなっちゃうから重要だよな、、

Railsのコロンが2個並ぶやつ :: ←これ

短めです

Railsを読んでた時に、クラスを呼び出す際にコロン2つから始まる呼び出し方をみました

こんなやつ↓

::Foo::Bar

これってFoo::Barって書くのと何が違うんだろうと思って調べました

Foo::Barと書くと、ファイルのある階層の中でFoo::Barを探しますが、::Foo::Barとかくとパスのトップから見に行き、1番上にあるものを呼び出すそうです

OAuth徹底入門の読書感想文 -7章-

OAuth徹底入門を読んだので感想と概要を書いていきます

www.shoeisha.co.jp

6章については先日書きました

zwzw.hatenablog.com

7章 よく狙われるクライアントの脆弱性

この章ではOAuthクライアントを実装する際に注意するべき、狙われやすいポイントについて説明されています

クライアントに対するCSRF攻撃

CSRFについては以前記事を書きました

zwzw.hatenablog.com

OAuthにおけるCSRFでは、攻撃者はあらかじめ認可サーバーから認可コードを取得し、偽造する

攻撃者は被害者を騙して、攻撃者が偽造した認可コードを被害者のクライアントが使用するように仕向ける

これにより、攻撃者の認可情報とクライアント・アプリケーションが結びついてしまう

対策としては推測できないstateパラメータを生成し、認可サーバーを呼び出す最初の手順でこれを渡す

クライアントはリダイレクトされた際にstateパラメータをチェックし、最初に送ったものと変わっていないか確認する

そうすることで、攻撃者の認可コードを使ったり、被害者のクライアントに注入したりすることを防ぐことができる

クライアント・クレデンシャルの不当な取得

ネイティブ・アプリなどのデバイスにインストールして使われるものは、内部にクレデンシャルを隠していてもデコンパイルされてクライアント・クレデンシャルが漏洩し、誰でもクライアントとして認可サーバーに認証されてしまう恐れがある

動的クライアント登録 (Dynamic Client Registration)を呼ばれる機能を使うと、OAuthのトークンのリクエストを行なった際にクライアント・シークレットが発行され、ネイティブ・アプリケーション中に最初からクレデンシャルが埋め込まれている状態を防ぐことができる

リダイレクトURIの登録

クライアントが認可サーバーにredirect_uriを登録する際にはできるだけ完全なURIを登録するべきである

下に良い例と悪い例を示す

// 良い例
https://foobar.com/oauth/oauthprovider/callback

// 悪い例
https://foobar.com/

悪い例のようにドメインのみ登録したり、パスの一部しか登録しないと、容易にトークンの乗っ取りが可能になってしまう

もちろん認可サーバーもURIの完全一致のみ検証方法として用いるべきではあるが、サブディレクトリを許可するような設定になっていてもトークンが乗っ取られないように、リダイレクトURIは正しく記載しておく必要がある

認可コードの不正な取得

認可コードによる付与方式を狙った攻撃として多いのがHTTPリファラーを利用したもの

HTTPリファラーとはHTTPヘッダーのフィールドで、あるページから別のページに遷移する際にブラウザによって、どのURIから来たかという情報が記録されるもの

認可サーバーがリダイレクトURIにサブディレクトリを許可している場合、攻撃者はリダイレクト先にHTTPリファラーを有効にしたリンクを置いておきユーザーにクリックさせる

HTTPリファラーにはパラメータも一緒に参照できるため、認可コードが攻撃者から丸見えになってしまう

やっぱりリダイレクトURIは正しく登録しておく必要がある

感想

いろんな攻撃手法があるが、きちんとOAuthのやり方に則っていれば少なくともこの章で書いてあった攻撃は防げそうだと感じた

stateパラメータを使う、クライアントにあったフローを選ぶ、リダイレクトURIは完全に指定する、簡単だけど強力なセキュリティ

VS Code Meetup #2 - Live Share編に参加してきた!

以前参加したVS Code Meetupの2回目が1/23にMicrosoftのオフィスで開催されたので参加してきました!

マイクロソフトの入り口
今回はMicrosoftでの開催でした

1回目の様子は下の記事で書きました

zwzw.hatenablog.com

VS CodeGithubossの中でで一番contributorの多いリポジトリだそうです

今回はLive Share編ということで、VS Codeの機能の1つであるLive ShareをメイントピックにしたMeetupでした

Live Shareとは

Live Shareは1つのソースコードを複数人で同時に編集できるVisual Studio Familyの機能です

以下にあげるようなことができます

具体的な用途としては

  • ペアプロ、モブプロに向く
  • 対話型教育
  • 面接 (コーディングテスト)

などが可能です

Live Shareのユースケース
コードレビューなども良さそう

VS Codeのドキュメントは基本的に英語だけのことが多いそうですが、Live Shareは日本語サイトあります!

visualstudio.microsoft.com

Live Shareを実際に使ってみる

Live shareを使うにはマーケットで公開されてる拡張を入れればOKです

vscodeのextensionでlive shareと検索した結果
オーソドックスなのは一番上、オススメは上から4つ目の extension packだそうです

オススメされていたLive Share Extension Packの中身は以下の4つです

  • Live Share
  • Live Share Audio
    • VSCode同士で音声共有ができる!
  • Live Share Chat
  • VSCode同士でチャット共有ができる!
  • Peacock
    • 複数window開いている場合、windowごとに枠をカラーリングできる便利な機能

会場では実際に大阪会場と東京会場でLive Shareを使って共同編集していました

東京: VS Code on Mac、大阪: VS Code on windowsと場所、OS、エディタが全部違う状況で同時にデバッグしてます

Live Share字のVS Codeのキャプチャ
カーソルに操作者の名前が出ます

大阪側で仕込んだブレイクポイントを、東京でステップ実行してたりしてすごい、、

macにpower shellが共有することが出来る! (意味があるかは謎)

terminalの共有も可能ですが権限渡しちゃうと本当になんでもできるのでこれは注意が必要そう

もちろんread onlyにすることも出来ます

最大30人と共有可能、ただ会場にいただれも30人以上接続した時に何が起こるかはわからないとのことです、、w

あんまり人と一緒に開発しない人も使える! (?)

また、LTではLive Shareは1人でも使える!と発表している方もいました

どういうことかというと、例えば自宅のデスクトップPCで作業している途中で外出した場合、VS Codeさえ入っていれば手持ちのノートPCで続きから作業できるぞ!ということだそうです

僕は家でもノートPCで作業してるんでこの恩恵には預かれないですけどこれは意外と便利そう!?

感想

Live Shareまだ使ったことないんですがチームで開発する上では結構使い所多そうだなって気がしました

そのためにも会社にガンガンVS Codeを布教しなければ、、w

Rubyのobjectとselfの違い

先日、railsで継承元のclassで定義されているmethodを継承先のclassで使おうとしたらエラーになりました

class parentClass

    def hoge
        return 'hoge'
    end
end
class ChildClass < ParentClass
     def fuga
        object.hoge
    end
end

これはエラーになります

正しく動かすには以下の書き方をする必要があります

class parentClass

    def hoge
        return 'hoge'
    end
end
class ChildClass < ParentClass
     def fuga
        self.hoge
    end
end

objectをselfに変えると継承元のmethodが使えるようになります

参考

詳しいスコープの違いはリンクを参照してください

ruby-for-beginners.rubymonstas.org