ばぁど・うぉっちんぐ

セキュリティに強いWeb屋。自由と春を求めて羽ばたく渡り鳥。

このブログはGoogle Analyticsを利用しています

情報処理安全確保支援士のオンライン講習Cを受講してみた話

情報処理安全確保支援士3年目になりました。

情報処理安全確保支援士の講習は、毎年GW前から開始していたのですが、2020年度は情報処理安全確保支援士に関する法律の改正があったため少しタイミングが遅れて5月後半からの申し込み/実施でした。

講習A、講習Bの感想は下記です。 ultrabirdtech.hatenablog.com

ultrabirdtech.hatenablog.com

講習Cの内容

毎年、講習内容は見直しが入るみたいですね。 本年度は下記のテーマが個人的にはとても興味を持てました。

特にSOCチームの平常時、インシデント対応時のフローに関しては、一時期仕事としてインシデントレスポンスに関する教育を行っていたので、資料の作り方などとても勉強になりました。

平常時の対応

SOCチームにおける平常時の対応について学びました。

なんだかんだ平常時にどれだけ準備ができるかにかかっていますよね。

平常時にどれだけセキュリティ製品の検知率を高めて、緊急時対応のフローを事前に定めておくことができるかはとても大事です。

インシデント対応の全体プロセス

SOC チームにおけるインシデント対応時のプロセスを学びました。 インシデント対応の定型的なプロセスってなかなか内部にいても把握できないみたいなんですよね。

倫理と法令、契約

情報処理安全確保支援士が持つべき倫理と法令、契約についてです。 実際は倫理で 1 テーマ、法令、契約がセットで 1 テーマです。

倫理は2年目の講習Bにもありましたが、やはり毎年見るサイバー犯罪を見ると技術者は倫理が求められるんだなと痛感します。

法令、契約に関しても情報処理安全確保支援士が法律上どのような定義がされていて、どう言った役割が求められているかなどを学びます。 個人的に特に勉強になったのが、民放改正です。

2020年は民放改正のタイミングとかぶったので、請負や準委任契約などの法律が変わったことは本講習で知りました。 立場的にメンバーの契約なども気にしなければいけない立場にいるので良いきっかけになりました。

感想

講習内容にもよるのですが、インシデント管理などは個人的に興味、知見があったところだったので楽しめました。

あと残すは集合研修なのですが、新型コロナの影響で受講日の予定が立たず。。。 早く集合研修も受けてみたいです。

フィッシングサイトを構築できる SocialFish を使ってみる

本記事に書かれていることは決して悪用しないでください。 本記事に書かれている内容を使用して不都合が起きたり、何かのトラブルに巻き込まれた場合でも筆者は一切責任を取りません。筆者は情報処理安全確保支援士であり、自己研鑽のためこれらの技術に触れ傾向と対策を勉強しております。

SocialFIshとは

Educational Phishing Tool & Information Collector

フィッシングツールを学ぶためのものです。 また情報を収集するためのツールとして役立てることができます。

Python で書かれています。

github.com

フィッシングとは

人間の脆弱性を悪用してくる攻撃手法です。 主に人を騙すことで、秘匿情報であるWebへのユーザー名やパスワード、銀行の暗証番号やクレジットカードの番号などを盗み取ろうとします。

例えばフィッシングメールや、フィッシングサイトのことを指します。

ダウンロード(git clone)

$ git clone https://github.com/UndeadSec/SocialFish.git
Cloning into 'SocialFish'...
remote: Enumerating objects: 1203, done.
remote: Total 1203 (delta 0), reused 0 (delta 0), pack-reused 1203
Receiving objects: 100% (1203/1203), 14.75 MiB | 1.43 MiB/s, done.
Resolving deltas: 100% (522/522), done.

下準備( pip install)

$ python3 -m pip install -r requirements.txt 

実際に使ってみる

python3 SocialFish.py [username] [password]

$ python3 SocialFish.py [username] [password]


                          '
                        '   '  UNDEADSEC | t.me/UndeadSec 
                      '       '  youtube.com/c/UndeadSec - BRAZIL
                 .  '  .        '                        '
             '             '      '                   '   '
  ███████ ████████ ███████ ██ ███████ ██       ███████ ██ ███████ ██   ██ 
  ██      ██    ██ ██      ██ ██   ██ ██       ██      ██ ██      ██   ██ 
  ███████ ██    ██ ██      ██ ███████ ██       █████   ██ ███████ ███████ 
       ██ ██    ██ ██      ██ ██   ██ ██       ██      ██      ██ ██   ██ 
  ███████ ████████ ███████ ██ ██   ██ ███████  ██      ██ ███████ ██   ██ 
      .    '   '....'               ..'.      ' .
         '  .                     .     '          '     '  v3.0Nepture
               '  .  .  .  .  . '.    .'              '  .
                   '         '    '. '      Twitter: https://twitter.com/A1S0N_
                     '       '      '       Site: https://www.undeadsec.com
                       ' .  '
                           
Go to http://0.0.0.0:5000/neptune to start
 * Serving Flask app "SocialFish" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

http://0.0.0.0:50000/neptune にアクセスした結果

f:id:UltraBirdTech:20200329151618p:plain

ユーザー名、パスワードは起動時に指定したものが入る。

ログイン後

QRコードやアクセストークンを確認できるので、これを Config.py に記載する必要がある。 f:id:UltraBirdTech:20200329152330p:plain

core/config.py

  1 # COMPRESS APP ------------------------------------------------------------------------------    --------------------
  2 COMPRESS_MIMETYPES = ['text/html', 'text/css', 'text/xml', 'application/json', 'application/j    avascript']
  3 COMPRESS_LEVEL = 6
  4 COMPRESS_MIN_SIZE = 500
  5 # -------------------------------------------------------------------------------------------    --------------------
  6 # LOCAL CONFIGS------------------------------------------------------------------------------    --------------------
  7 DATABASE = "./database.db"
  8 url = 'https://github.com/UndeadSec/SocialFish'
  9 red = 'https://github.com/UndeadSec/SocialFish'
 10 sta = 'x'
 11 APP_SECRET_KEY = '★ここに記載する★'
 12 # -------------------------------------------------------------------------------------------    --------------------
~                          

GitHub のフィッシングサイト

f:id:UltraBirdTech:20200329152822p:plain

画像のようにフィッシングサイトとしてコピーしたいサイトの情報を入力します。 左がコピー元のURLで、右側が情報入力後に遷移する先のURLです。(基本はどちらも同じで大丈夫) ログインURLを入力した後に雷アイコンをクリックすると、同IPアドレス上にGitHubのフィッシングサイトが立ち上がる。

f:id:UltraBirdTech:20200329153000p:plain

試しに ユーザ名: test, パスワード test でログイン処理を行ってみると、リダイレクト後として設定している https://github.com/login に遷移する。

情報の搾取が成功すると画面下部にログが表示される。 f:id:UltraBirdTech:20200329153431p:plain

「VIEW」をクリックするとフィッシングで得られた情報を取得することができる。 f:id:UltraBirdTech:20200329153516p:plain

テストで入力したユーザー名:test , パスワード:test を取得することができた。

あー。。。これは悪い。

おまけ・フィッシングサイトに対する対策法

なんか、対策をしっかり書いておかないと逮捕されそうだったので

フィッシングサイトに対する対策を列挙します。

1. URL欄を確かめる

フィッシングサイトに対してはURLをしっかりと確認することが重要です。 下記画像の赤枠部分ですね。 本来であれば、GitHubは [ github.com/login ] というのが、ログインのURLになります。このURLを確認した上で、正当なログインページかどうかを確認する必要があります。 f:id:UltraBirdTech:20200329153945p:plain

ただ、気をつけて欲しいことは攻撃者は我々を騙すために似たようなURLを取得してくること。例えば GitHub なのであれば、i を 1にしたりですかね。例(g1thub.com/login

また、合わせて偽ページだと思わしきWebページの証明書の確認もしておくと良いでしょう。

下記は実際の GitHub の証明書です。正規のWebサイトであれば下記のような証明書を確認することで、フィッシングサイトかどうかを見分けるためのヒントとなります。 f:id:UltraBirdTech:20200329154159p:plain

2. 送られてきたURLを安易に開かない

一般的にこれらのフィッシングサイトへ誘導するURLはメールなどで送りつけられてきます。 いわゆる標的型攻撃の対象となってしまった企業に所属している従業員のメールアドレスに大量にフィッシングサイトへ誘導するようなメールを送り、情報を搾取しようとします。

メールだけでなく、不特定多数の人が投稿できる掲示板や、SNS(TwitterFacebookなど)に投稿されているURLなども気をつけたほうがいいでしょう。

3. 多要素認証を設定する

※ユーザー名、パスワードが盗まれた時のみの対策です

フィッシングサイトに対する直接的な対策にはなりませんが、フィッシングによってユーザー名、パスワードを盗まれてしまった時の一時的な対策にはなります。

例え盗まれたユーザー名、パスワードで攻撃者がログインしようとしても、認証する要素を追加しておくことで不正ログインを防ぐことができます。

最近のWebサービスですと、新しい端末からログインが施行されようとした場合登録済みのメールアドレスへ通知するような機能を持っていたりするので、多要素認証で食い止めている間に早急にパスワードを変更するなどの対策が必要です。

まとめ

  • SocialFish はフィッシングサイトを立ち上げるためのツール
  • 悪いことに使っちゃダメ絶対!

OSINTツール theHarvester を使ってみたのでまとめ

どーも。ばぁどです。

theHarvester とは

Pythonで書かれてたOSINTツールです。 Web上に公開されているメールアドレスやドメインなどの情報を収集することが可能です。

github.com

Google はもちろんのこと、bingやyahooなどの検索サイトで公開されているかどうかを確認することが可能です。

実際に使ってみる

GitHub から clone する

$ git clone https://github.com/laramies/theHarvester.git
Cloning into 'theHarvester'...
remote: Enumerating objects: 6571, done.
remote: Total 6571 (delta 0), reused 0 (delta 0), pack-reused 6571
Receiving objects: 100% (6571/6571), 4.66 MiB | 3.22 MiB/s, done.
Resolving deltas: 100% (4404/4404), done.

初期設定

requirements.txtが存在するので、pip installで必要なライブラリなどを取得する。

$python3 -m pip install -r requirements.txt

※必要に応じて sudo 権限を用いる

実行

実行コマンド

python3 theHarvester.py -d [domain] -l 100 -b all

実行結果

ドメインIPアドレスはマスキングしています。

*******************************************************************
*  _   _                                            _             *
* | |_| |__   ___    /\  /\__ _ _ ____   _____  ___| |_ ___ _ __  *
* | __|  _ \ / _ \  / /_/ / _` | '__\ \ / / _ \/ __| __/ _ \ '__| *
* | |_| | | |  __/ / __  / (_| | |   \ V /  __/\__ \ ||  __/ |    *
*  \__|_| |_|\___| \/ /_/ \__,_|_|    \_/ \___||___/\__\___|_|    *
*                                                                 *
* theHarvester 3.2.0dev0                                          *
* Coded by Christian Martorella                                   *
* Edge-Security Research                                          *
* cmartorella@edge-security.com                                   *
*                                                                 *
******************************************************************* 


[*] Target: [domain] 
 

[!] Missing API key. 

[!] Missing API key. 

[!] Missing API key. 

[!] Missing API key. 
Searching results
[*] Searching Duckduckgo. 
[*] Searching Baidu. 
    Searching results.
[*] Searching Suip this module can take 10+ min but is worth it. 
[*] Searching Dnsdumpster. 
[*] Searching Otx. 
[*] Searching Exalead. 
    Searching results.
[*] Searching Bufferoverun. 
[*] Searching Dogpile. 
    Searching 0 results.
[*] Searching Threatcrowd. 
[*] Searching CRTsh. 
    Searching results.
    Searching 0 results.
[*] Searching Bing. 
[*] Searching Virustotal. 
[*] Searching Netcraft. 
    Searching 100 results.
[*] Searching Google. 
    Searching results.
[*] Searching Certspotter. 
    Searching 100 results.
[*] Searching Linkedin. 

[*] Users found: 13
---------------------
Christine Flynn - QESH Document Controller - [domain]
Cynthia Rubio - Executive Secretary - [domain]
David Yu - Rolling stock engineer - [domain]
Deepak Dubey - Senior Manager - [domain]
Dr. SOTIRIOS PASCHALIDIS - Director - [domain] Ltd
Duncan White - Resident Engineer Roads - [domain]
Edom Bezu - Topographic Engineer - [domain]
[domain] [domain] - Truck Driver - Transputinas ltd
Maurice Opar - Assistant Engineer - [domain]
Phillip MBULIGWE - Environmental Expert - [domain]
Pragati Srivastava - Manager HR - [domain] India
Rajkumar Vishwakarma - Engineer - [domain]
Shivani Sonu - Assistant Manager - [domain] India Pvt Ltd.
    Searching 100 results.
[*] Searching Linkedin. 

[*] No links found.


[*] Searching Intelx. 

    Searching 0 results.
[*] Searching Trello. 

[*] IPs found: 5
-------------------
24.xxx.xx.xxx
158.xxx.xxx.xx
183.xx.xxx.xx
183.xx.xxx.xx
210.xxx.xx.xxx

[*] Emails found: 1
----------------------
contact@[domain]

[*] Hosts found: 19
---------------------
an[domain]:183.xx.xxx.xx
blog.an[domain]:183.xx.xxx.xx
blue-a[domain]:183.xx.xxx.xx
[domain]:24.xxx.xx.xxx
[domain]:24.xxx.xx.xxx
[domain]:24.xxx.xx.xxx
mail.[domain]:158.xxx.xxx.xx
mail.[domain]:158.xxx.xxx.xx
mta-sts.an[domain]:183.xx.xxx.xx
mta-sts.blue-a[domain]:183.xx.xxx.xx
raya[domain]:183.xx.xxx.xx
www.an[domain]:183.xx.xxx.xx
www.blue-a[domain]:183.xx.xxx.xx
www.[domain]:183.xx.xxx.xx
www.[domain]:183.xx.xxx.xx
www.[domain]:183.xx.xxx.xx
www.[domain]:183.xx.xxx.xx
www.raya[domain]:158.xxx.xxx.xx

[*] Trello URLs found: 7
--------------------
https://trello.com/b/blagzqzl/india-business-r[domain]trations
https://trello.com/b/grflbrwz/customer-billing-schedule
https://trello.com/b/kil63azb/besoin-de-support-[domain]
https://trello.com/c/npdtcnk5/21-[domain]
https://trello.com/c/npzaomsn/3-[domain]-polska-sp-z-oo
https://trello.com/c/odjfmuqn/22-[domain]-m
https://trello.com/gal[domain]1

まとめ

  • theHarvester は 情報を集めるOSINTツール
  • Python 環境が構築されていれば使用可能

エンジニアとしての基礎をどう築くか -7年目エンジニアの振り返り -

社会人1年目、プログラマなりたての時に上司に言われていた言葉がある。

急がば回れ。基礎を築きなさい。」

基礎がなければ、その上の応用的な技術など身につきません。

PHPを理解できていない方がPHPの FW を用いて Webアプリケーションを作ろうとしても、FWのルールに忙殺されてまともなものはできないでしょう。 基礎力が身についていなければ、公式文書を読んでも理解度が低くなることを想像することは用意です。

「基礎が大事」という言葉があったからこそ、エンジニアになって7年目になろうとしている今でも基礎を愚直に大事にしている自分がいます。

そんな若輩者の私にも後輩ができ、部下と言えるような方々ができるようになりました。技術的な指導を任されてもいて、基礎を気づく事の大切さを伝えています。

しかし、最近の悩みは技術者としての基礎をどのように築くかの、 How が思いっきり抜けてしまっていることです。

そこで今回は自分自身が基礎力をどう身につけたかを、次メンバーに話すタイミングがあったときのメモとして置いておこうと思います。

プログラマとしての基礎

繰り返し構文と条件分岐

プログラマとしての基礎は、まずは繰り返し構文と条件分岐だと考えています。

forifですね。

どんなに簡単なプログラミング言語の入門書を手にとっても、このfor文if文は最初の方のページに掲載されているものです。

個人的な感覚ですが、大抵のプログラムはforifを書けないとまともに動くプログラムはできません。

これらを覚えるためには有名なfizzbuzzや、数年前にバズったズンドコなどを課題として与えてあげればいいかなと思っています。

クラスを意識させること

次段階として、クラスを認識することです。 クラスを理解できていない人には業務ロジック触らせません。

いわゆる、タイヤキクラスでも動物クラスでもいいです。 クラスを理解できればいい。 ※タイヤキも動物も例として微妙なので私はあまり使わないですが

個人的に教えていて一番反応が良かったのはポケモンですね。

from random import choice

class Pokemon():
    def __init__(self, name, attribute, moves, is_mega=False):
        self.name = name
        self.attribute = attribute
        self.moves = moves

    def attack(self):
        print(choice(self.moves))


class Pikachu(Pokemon):
    def __init__(self):
        name = 'Pikachu'
        attribute = 'thunder'
        moves = ['thunder shock', 'iron tail', 'Volt Tackle', 'Grass Knot']
        super().__init__(name, attribute, moves)

p1 = Pikachu()
p1.attack()

ポケモンクラスという親クラスがあって、ピカチュウリザードンポケモンクラスを継承して定義される。 is-a関係を表しやすいのもポイントです。

教えるときは、ポケモンクラスを例にして身の回りのものや自分の趣味のものをコードで表すように指示しています。 (ただ、あまりいい例が思い浮かばない・・・)

ちなみに、オブジェクト指向とクラスは別物という認識です。 オブジェクト指向を理解せずとも、一旦クラスは理解できるは。 クラスとオブジェクト指向を一度に理解しようとすると、難しすぎるので初学者にはクラスとオブジェクト指向は分離して教えるようにしています。 オブジェクト指向を理解している人が綺麗なコードを書けることを大前提として、後からジョインする人がクラスさえ理解できていれば、それらの綺麗なコードを参考にコードを書くことが可能です。

一つの言語に深く潜ること

一つの言語に深く潜って勉強することを教わりました。

それに従って、言語がどのようにメソッドを探索しているのかや、言語ごとの特徴を把握しやすいというメリットがありました。

例えば、私は Ruby が一番得意な言語だと自負しております。 というものの、Ruby でプログラム言語のノウハウを学んだと考えているからです。

Ruby は資格勉強(Silver, Gold)も行ったので愚直にメソッド名や動きを記憶しました。

また、メタプログラミングRubyも読んだので Ruby でメソッドチェーンなどを学びました。オブジェクト指向も同様です。

社会人3年目〜4年目で Ruby を愚直に勉強し、一つの言語に深く潜ったからこそ、その後PHPを勉強し直したときや、Pythonを学んだときは Ruby と同じような感覚で勉強を行うことができました。

IT関連の基礎を養うために読むべき本

本をたくさん読みました。

これも一年目の時に言われたのですが、本やクラウドに勉強として払うお金は自己投資と教え込まれたからです。

リーダブルコード

www.oreilly.co.jp

プログラム書く人なら言わずもがなの名著。 ソースコードをいかに読みやすく書くかのノウハウが詰まっている。 プログラムは書くことより読む事の方が多い。だからこそ、万人が読みやすいコードを書くことを心がけるって大事。 本の中身も冗談が入り混じっていて、とても分かりやすく、面白い。

プログラムはなぜ動くのか

www.amazon.co.jp

プログラムがなぜ動くのかを解説してくれている。 ぶっちゃけ、大学の講義とかで教わることができるレベルのことが、一冊に詰まっている。

ネットワークはなぜつながるのか

www.amazon.co.jp

プログラムはなぜ動くのかと同じ。 大学時代にこんな講義を受講したなーという思い出(講義内容は覚えていない←)

マスタリングTCP/IP

www.ohmsha.co.jp

プログラマではなく、ネットワークの知識が必要な時の鉄板本だと思っています。 ネットワークの歴史から書いてくれているのが、とても良い。

Webを支える技術

gihyo.jp

プロになるためのWeb技術入門

www.amazon.co.jp

まとめ

結局、自分がエンジニアとしてどう勉強してきたかの振り返りになった気がする。

これで基礎をどう築くかの問いに対しての答えを用意できたと思っています。

【駆け出しエンジニア向け】 Webアプリエンジニア出身の情報処理安全確保支援士がまとめる Web の脆弱性超基礎④ - 認証・認可の不備 -

概要

今回は少し変化球です。 サイバーセキュリティの世界では認証(Authentication)と認可(Authorization)という単語が存在します。

二つの単語はとても似ていますし、境が曖昧なエンジニアのかたをよく見かけます。

認証・認可とは

認証とは

Wikipedia より引用

認証(にんしょう)とは、何かによって、対象の正当性を確認する行為を指す。

認証とは、本人確認のことを指します。

例えば車を運転している時に検問などで警察官から運転免許書の提示を求められますね。 それと同じで、最近だとライブ会場でも本人確認のために、本人確認書類が求められます。

これらは、本人を確認するための行為です。 Webの世界では、主にパスワード認証が扱われています。

これから紹介するのは認証を行うために必要な3つの要素です。

知識認証

知識認証とは、利用者本人の記憶していること、知識をもとに認証する方法です。

具体例としてパスワード認証や、秘密の質問などが存在します。

特にパスワード認証はありとあらゆるWebアプリケーションのログイン機構として扱われており、ほぼ全てのメンバー管理機能を持つようなサイトで採用されていることでしょう。

利点としては、一般的に普及している認証方法なので、比較的万人に受け入れられやすいことでしょうか。

問題点としては、パスワードの管理が煩雑になりやすいということです。共通のパスワードを使いまわしたり(絶対だめ)、メモ帳などにパスワードを管理したりする。 パスワードの使い回しは言語道断だが、メモ帳へのパスワード記入などは、また別の脆弱性を生む可能性があり、パスワード管理はとても難しい。

パスワード管理ツールなり、パスワードをフレーズで覚えて使いまわさないようにする工夫などが必要になります。

物理認証

物理認証とは、物理的な要素を用いて認証をする方法です。

ITの世界では、OTP(One Time Password)などが有名ですね。 OTPは一定期間で変わるパスワードを発行するトークン機器やアプリを用いて、それらの情報で認証を行う方法です。

利点としては、物理的な物を持っていることで本人と認証することが可能であるという点で、知識認証などとは違い管理が煩雑になりません。 問題点としては、物理的な物を紛失、もしくは盗難に遭ってしまうと認証が突破されてしまう可能性があることです。

生体認証

生体認証とは、生体的な情報を用いて認証を行う手法です。 指紋や色彩、などの生体情報をデータ化して認証情報とします。

利点としては、知識認証、物理認証と比べて詐称するのが難しいという点。 問題点としては、実装が技術的に難しかったり、本人拒否率と他人許容率などのバランスが難しいと言ったものがあります。

多要素認証

多要素認証とは、本人確認のために複数の認証を用いる方法です。

上記の知識認証、物理認証、生体認証のどれか2種類以上を使って認証を行なっていれば、多要素認証という扱いになります。

1番身近な例としては銀行のキャッシュカードを用いたお金の引き落としなどが該当します。 お金を引き出す際は、キャッシュカードと4桁の暗号番号が必要だと思うのですが、これは物理認証と知識認証の二つを用いております。

また3つの要素を兼ね備えているのが、天空の城ラピュタの「バルス」ですね。 知識認証(バルス)、物理認証(飛行石)、生体認証(王家の血)という三つの条件が必要なので、バルスは三桁のパスワードで脆弱すぎwwwと言われるのを時々聞きますが、わりとバルス自体はセキュリティ的に固いことがわかります。

認可

認可とは、本人認証が終わった後に、その本人、もしくは役職や所属しているグループごとにに与えられている権限のことを指します。

運転免許証であれば、普通車や大型など、どの車種を運転することができるか?という部分が認可情報となります。

Twitter の連携アプリなどを開くと下記のような画面が表示されます。 これはTwitter の認証が終わった後、Twitter のどの機能に対してのアクセスを許可するかを確認する認可画面と呼ばれるものです。

f:id:UltraBirdTech:20200229172928p:plain

認証・認可の不備とは

認証の不備

認証の不備とは、本人確認の機能が十分ではなく、本人認証が行われずにWebの機能などを扱えてしまえることです。

例えば本来であれば、他人が知ることのできない情報で知識認証をしなければいけないところを、利用者の誕生日で認証ができてしまったりとかする場合は認証の不備があると言えるでしょう。

認可の不備

認可の不備とは、認可された権限では閲覧できないはずのフォルダなどにアクセスできてしまう場合は認可の不備が認められます。

例えば、社内システムで、経営層しかアクセス権を与えられていない資料に一般社員がアクセスできてしまうなどの問題があると認可の不備と言えるでしょう。

Webの世界では、会員サイトにおいて無料会員であるにも関わらず、有料会員ではないとアクセスできないページへアクセスしたり、機能を扱えてしまう場合は認可の不備にあたります。

対策

認証・認可の不備の対策としては、不備がないように実装することです。(何の対策とも言えていない)

まとめ

・認証とは本人確認のこと ・認可とは認証後の本人(役職)に紐づく権限のこと

おまけ — 個人的に利用しているパスワード管理ツールなど —

パスワード管理ツール

OnePassword 使用しています。 煩雑になりやすいパスワードを、マスターパスワード一つ覚えておくだけで全て管理してくれます。 アプリ、ブラウザ拡張があるので色々なデバイス、PCでパスワード管理を行うことができます。 年額がかかりますが、パスワードの使い回しをするくらいならツールに頼るという選択をしました。

1password.com

OTPアプリ

多要素認証が設定されているSNSやツールは全てOTP設定をしています。もしブルートフォースや、上記OnePasswordがハッキングされてパスワードが突破されても、多要素認証を設定しているので安心です。

Google Authenticator

Google Authenticator

  • Google LLC
  • ユーティリティ
  • 無料
apps.apple.com

play.google.com

やはり、セキュリティエンジニアとしてはこういう振る舞いから入るというのも大事なのかなと考えています。

【駆け出しエンジニア向け】Webアプリエンジニア出身の情報処理安全確保支援士がまとめる Web の脆弱性超基礎まとめ

Webの脆弱性超基礎の記事が多くなりそうだったので、まとめページ作っておきます。

筆者ようの備忘録です。(自己満足記事です)

新しい記事書いたら随時更新します。

【駆け出しエンジニア向け】 Webアプリエンジニア出身の情報処理安全確保支援士がまとめる Web の脆弱性超基礎④ - 認証・認可の不備 - - ばぁど・うぉっちんぐ

【駆け出しエンジニア向け】 Webアプリエンジニア出身の情報処理安全確保支援士がまとめる Web の脆弱性超基礎③ -CSRFの脆弱性編- - ばぁど・うぉっちんぐ

【駆け出しエンジニア向け】 Webアプリエンジニア出身の情報処理安全確保支援士がまとめる Web の脆弱性超基礎② -SQLインジェクション編- - ばぁど・うぉっちんぐ

【駆け出しエンジニア向け】 Webアプリエンジニア出身の情報処理安全確保支援士がまとめる Web の脆弱性超基礎① -XSS編- - ばぁど・うぉっちんぐ

【駆け出しエンジニア向け】 Webアプリエンジニア出身の情報処理安全確保支援士がまとめる Web の脆弱性超基礎③ -CSRFの脆弱性編-

超基礎まとめ記事第三弾です。

前回の記事はこちら。

ultrabirdtech.hatenablog.com

今回はCSRF脆弱性です。

概要

CSRF(Cross Site Request Forgeries)の脆弱性とは、リクエストの強要とも言い利用者が意図しないリクエストを外部の攻撃者に実行されてしまう脆弱性です。

Webアプリケーションには、様々な重要な処理があります。 例えば、ブログの投稿処理や、オンライショップサイトの商品購入、オンラインバンクの入金処理など、本人ではないと許されないような処理が存在します。

これらは基本的にPOST処理でサーバー側では処理されるのですが、このPOST処理を行う際の処理に問題があると、CSRF脆弱性が発生してしまいます。

これらの処理を正しい利用者が知らないところで、攻撃者によって行われてしまうことがCSRF脆弱性です。

有名な事例としては、2005年の mixi で起きた「はまちちゃん」というものがありました。 https://www.itmedia.co.jp/enterprise/articles/0504/23/news005.html

CSRF脆弱性の特徴としては、サーバーに届くリクエスト自体は正しいものになるというものです。 あくまでリクエストを送っている本人が利用者ではなく、攻撃者なだけでありサーバー側としては、サーバーに届いてくるリクエストが正しい利用者からのものなのか、攻撃者からのものなのかの判別をつけることができません。

対策

基本的な対策として重要なPOST処理を行う際にリクエストが正しいものかを確認する処理が必要になります。 対策としては主に3つが存在します。

1. トークン確認処理を行う

重要な処理を行う前の画面で、サーバー側から一意な値トークンを画面側に発行します。 画面側からは、このトークンをhidden属性に入れて重要な処理を行うパラメーターと一緒にサーバー側に送り返します。 サーバー側は、自分自身が発行したトークンと受け取ったトークンが一致するかを確認し、一致すれば正しいリクエストとして処理を続行します。

最近のWebフレームワークではこのトークンによる対策が進んでおり、基本的にはWebフレームワークのルール通り実装していれば、CSRF脆弱性は防ぐことが可能です。

2. リファラーのチェックを行う

重要な処理を行う前の画面などがどこから来ているのかというRefererという属性が存在します。 そのRefererが、重要な処理を行う前の画面であるかを確認することでCSRF脆弱性を防ぐことが可能です。 ※しかしRefererは改ざん可能であり、対策としては不十分の場合があります。

3. 重要な処理の前に本人認証(パスワード認証)を行う

CSRF脆弱性の原因が、サーバーに送られたリクエストが正しい利用者からのものか判別できないからというものがあります。 正しい利用者であるかどうかが分からないのであれば、重要な処理の前で認証などを行なってあげれば良いのです。 パスワード認証であれば、基本的にパスワードを知っているのは利用者本人だけのため、パスワードを正しく入力できれば本人からのリクエストであることを証明できるでしょう。 特にオンラインバンキングなどの入金処理の前などは、パスワード入力などが求められる場合が存在します。

まとめ

CSRF脆弱性とはリクエストの強要のこと ・CSRF脆弱性に対する対策はPOST処理実行時のトークンの確認処理