メールアカウント盗られてこっそり受信されている例が結構ある話
ここのところサブミッションスパムが出されることが一定の頻度で続いていて最悪なのですが、そのことを調べていた時にちょっとイヤな例を見つけました。
サブミッションスパムで使われたアカウントがあり、ふとそのアカウントでメールの受信は来てるのかな?と確認しました。
すると、日本国内からのアクセスはないのに mail.ru ドメインからのアクセスがだいたい1時間に1回と定期的に来ていたのを見つけました。
mail.ru はロシアでメールサービスやっているところのドメインで、VPSのようなサービスもやっているところです。
なのでそこのWebメールサービスにアカウントが登録されていて、そこから受信が行われている、という可能性は考えられます。
ですが、その接続があった付近のIPで検索すると、他にも同様にアクセスされているアカウントがいくつもありました。
そしてそのうち一つは、その少し前にサブミッションスパムが出されていたものでした。
アカウント数を数えてみると、これまでサブミッションスパムで利用されてしまったよりも数倍多くありました。
あくまで状況証拠からですが、クラックされたアカウントが定期的に受信がされている、と考えるのが自然と思います。
状況まとめると
- 外部からこっそり受信のみが行われているアカウントが結構ある
- それらは1時間に1度くらいの頻度でメールが覗かれている
となります。
つまり、アカウント情報のもれたメールアカウントのメールを監視している大規模なネットワークが存在しているということなのです。
例えば、アカウント設定の再送をメールで行ったりしたのをフックして、そのアカウントも盗ってしまうとか、そういうのを自動でやってるのかなあ、と想像します。
これのなにが恐ろしいって、メール受信されていることをユーザは全く感知できない、ということです。
これ、大手ISPなんかだと、GoogleやLINEみたいに、普段の接続ではないIPからメール受信されました、みたいなアラート上げたりしてるんだろうか…?
こういうのって最近のセキュリティ界隈では結構知られていることなのでしょうかね?
(追記)
mail.ruのPOPしてくるIPからであること確認できたので、mail.ruに受信確認の設定がされているのだと思います。
またスマホから一つのメールアプリでまとめて読むために、mail.ruを使われる需要が結構あるようで、それように普通に設定していた可能性も高いです。
ただ、サブミッションスパムで利用されたアカウントとの重複率がだいぶ高いため、なんらかの理由で相関があるのだと思います。
例えば、そのようなユーザは他にもmail.ruのようなメール一括受信アプリを試している場合が多く、そこから漏れた or アカウント取得を主目的としたマルウェアを使ってしまった、などです。
このあたりは完全にこう、というのは結論づけることはできなそうですが。
Colabでshellを利用する
Google Colabを普通に使っているぶんには、例えばpip使ってなにかいれるような場合でも「!pip …」みたいにしてノート上で作業すれば良いのですが、なにかディープラーニング系のアプリケーションを入れて試すような場合だと、shellが使いたい… となることがあると思います。
そういう時にターミナルの画面出せるような方法ないのかな?と探したのですが、普通には出来ないのですね。
でそれを、ngrokを使って無理やりターミナルで繋げる方法が紹介されていました。
ngrok経由でsshdに接続できるようにする
import random, string, urllib.request, json, getpass #Generate root password password = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(20)) #Download ngrok ! wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip ! unzip -qq -n ngrok-stable-linux-amd64.zip #Setup sshd ! apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server pwgen > /dev/null #Set root password ! echo root:$password | chpasswd ! mkdir -p /var/run/sshd ! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config ! echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config ! echo "LD_LIBRARY_PATH=/usr/lib64-nvidia" >> /root/.bashrc ! echo "export LD_LIBRARY_PATH" >> /root/.bashrc #Run sshd get_ipython().system_raw('/usr/sbin/sshd -D &')
ngrokに接続するための認証とsshパスワードの取得
#Ask token print("Copy authtoken from https://dashboard.ngrok.com/auth") authtoken = getpass.getpass() #Create tunnel get_ipython().system_raw('./ngrok authtoken $authtoken && ./ngrok tcp 22 &') #Get public address and print connect command with urllib.request.urlopen('http://localhost:4040/api/tunnels') as response: data = json.loads(response.read().decode()) (host, port) = data['tunnels'][0]['public_url'][6:].split(':') print(f'SSH command: ssh -p{port} root@{host}') #Print root password print(f'Root password: {password}')
で、これで繋げられるようになるのですが、ちょっと目を離しているすきにすぐ切れてしまうため、screenとかを導入しといたほうが良いと思います。
ちなみにそれらの設定するための /root/.profile や /root/.screenrc などの設定ファイルは、
こちらで紹介されている「%%writefile」を使って書いとくと良いです。
長野ディープラーニング同好会 #14
長野ディープラーニング同好会14回めを開催しました。
自分が来年度の平日夜動けなくなる可能性があり、一旦休止するかもということで、これまでのまとめの意味もふくめて、簡単なコンペみたいなのをやってみました。
CIFAR10の認識をColabで10分だけ学習させて、テストデータでの認識率が一番高かった人の優勝、みたいなものです。
現代のCNNの直接の祖先であるLeNetをベースラインとして、そこから各種手法を取り入れていってどこまで上げられるか、という感じに行いました。
論文等ぐぐればCIFAR10認識のSoTA手法が出てくると思うのですが、そこはColab環境で「10分だけの学習時間」というしばりがあるため、例えば単純にネットワークを大きくすればいいとはならないわけです。
ただ、いきなりなにもない状況からだとみな書けないと思うので、下記のようにサンプルとなるコードを用意しました。
https://github.com/stealthinu/naganodeeplearningclub/blob/master/cifar10_10min.ipynb
最初は、非常に簡単にですが各手法がどういうことやっていてどんなメリット・デメリットが有るのかをざっと説明しました。
そこから各種手法を入れたり、パラメータを調節して認識率を上げてもらうようにしていただきました。
結局、ベースラインの70%に対し、80%の認識率になった方が一番になりました。
次回はどうなるかわかりませんが、とりあえずもう一度、2年前にやったディープラーニングハンズオンみたいなことをやれたらいいな、と考えています。
chroot環境で動くapache 2.4でCGIがPermission deniedになる問題
CentOS7 で chroot 環境で動く apache 2.4 の設定で、CGIがうまく動かないという相談を受けました。
apache 2.4 では mod_cgi ではなく mod_cgid を使うのですが、
[cgid:error] (13)Permission denied: [client *****] AH01257: unable to connect to cgi daemon after multiple tries: *****
のような感じのエラーが出て動かないという状況でした。
mod_cgid の設定は下記のようになっていました。
LoadModule cgid_module modules/mod_cgid.so <IfModule cgid_module> Scriptsock /var/run/cgid/cgisock </IfModule>
ここで「/var/run/cgid/」は chroot 環境のディレクトリに作られていて、パーミッションも与えられていて、実際 cgisock ファイルも apache が作成できている状況でした。
で実はこの「Scriptsock /var/run/cgid/cgisock」の指定のところ、よくあるのは「Scriptsock cgisock」のようにフルパスではなく書かれているのですが、この指定だと log ディレクトリ内に sgisock ファイルが作られてしまうため、このようにフルパスでの指定になっていました。
パーミッションについて色々試してもダメだったため、下記のように「Scriptsock /var/run/cgid/cgisock」を「Scriptsock cgisock」に修正して(もちろんディレクトリのパーミッションやオーナーは同じ設定)動かしたところ、無事に動くようになりました。
LoadModule cgid_module modules/mod_cgid.so <IfModule cgid_module> Scriptsock cgisock </IfModule>
なので cgisock ファイルは logディレクトリ内に作成されています。
chroot環境下のときの apache と mod_cgid のパスの扱いに齟齬がある?のかなと推測していますが、ちゃんと追って調べていません。
とりあえずこうやれば動く、ということだけ。
長野ディープラーニング同好会 #13
ディープラーニング同好会13回めを開催しました。
この回はちょっと人数が少なくて、新規に来られたかたも居なかったため、Colab上でKerasを使って、もっと大きなネットワークとTPUを使って、CIFAR-10の画像認識などを試せました。
あと、バックプロパゲーションが数式から導き出せることをなるべく直感的に分かる説明(と自分は思ってる)を聞いてみてもらいました。
これは前に多層ニューラルネットのバックプロパゲーションの学習が、数式から導出するのをどうするのか、という話があったとき、単に微分するのを勉強会で導出するのはみんな興味持ってもらえないだろうなと思ったのがありました。
ので、勉強会とかでもっと直感的に、なるべく数式が簡単になる説明の方法を考えたのでした。
が… 思っていたよりもみんな、???というような反応でちょっと残念でした。力足らずです。
長野ディープラーニング同好会 #12
ディープラーニング同好会12回め開催しました。
Colab上でKerasを使って、各関数でなにをやってるのかなどを説明しながら、MNISTやCIFAR-10の認識などを体験してもらいました。
これは最初の3回くらいまででやってたことを再度やり直してるわけで、多少資料直したりしてこなれてきた感じになりました。
でもまだMNISTで、画像の認識とかやらないとあまり楽しくないよなあ、というか「ディープ」ではないよねと思って、次回はもっと大きなネットワークで、TPU使って学習させて試せればと思います。
また別件で、登山者をディープラーニングの画像認識使ってカウントするという件についての説明をしました。
これは別でSlackをあげてあるのですが、登山者カウンターのチャンネルを作ってそこで話をすすめていくことになりました。
次回は、またColab上でKerasを使って、もっと大きなネットワークとTPUを使って、CIFAR-10の画像認識などを試す予定です。
時間があれば、多層ニューラルネットの関数から微分してバックプロパゲーションの学習式が出せるのを導出するのをやれればなと思います。
「ディープラーニングブームは続くのか 」というLTをしました
先日あった フリーテーマプレゼン大会 in GEEKLAB.NAGANO - connpass で ディープラーニングブームは続くのか というLTをしました。
これはここ数年のディープラーニングブームが、もうすぐ終わるものなのか、それともまだ続いて広く使われるようになるものなのか、を予想するという内容です。
これまでのニューラルネットの歴史、ディープラーニングのブームが入ってからの発展、現在の性能、などから考えて、これは一過性のブームではない、ということを説明しています。
長野ディープラーニング同好会 #11
ディープラーニング同好会11回め開催しました。
第10回の続きで、パーセプトロンの式からバックプロパゲーションの式にというか勾配降下法でやるために、シグモイド関数に変えた場合の式を追ってそれに合わせた実装にする(バックプロパゲーションの一段目の計算式にする)というのを変更する予定でした。 が、今回また新たに来られた方々がいらしたので、再度前3回くらいの内容をざっとおさらいして、それで最後にその部分を説明する、という感じになりました。
そのため、説明がだいぶ駆け足になってしまい、正直ちょっと端折りすぎだったと思います。 前回も駆け足すぎで、みたいな反省したのに全く反省を活かせてない… みたいになってしまいました。 やはり、ちゃんと時間とってもう一度2年前にやったようなハンズオンの内容を、ある程度省略できるところは省略し、せめて1日掛けてやったほうがいいんだろうなと思います。
次回は、またcolab上でKerasを使って、もうちょっと大きなネットワークを書いて、そこでMNISTやCIFAR-10の認識などを体験する、というのを演る予定です。 また別件で、登山者をディープラーニングの画像認識使ってカウントするという件があり、それについての話し合いをする予定です。
長野ディープラーニング同好会 #10
ディープラーニング同好会10回め開催しました。
第9回の続きで、学習の概念は説明したけども、じゃあ実際の実装はどうやってるの?というのを実際に実装してもらって確認しました。
一応、パーセプトロンの主要部分となるコードを書いていただいて、MNISTの認識を試してみることができました。
この辺のサンプルコードは2年前にやったディープラーニングハンズオンのほぼそのままなのですが、こういうのは変わらないからいいですね。
ただ、手で計算してもらって、その次にそのアルゴリズムをそのままpythonで実装して…という流れの資料にしていたのを、時間なくて端折って説明してしまったので、駆け足すぎた感じになったように思います。
たぶんColabとpython説明で1時間、パーセプトロンの学習方法復習して手で学習するので1時間、パーセプトロンの実装のところ1時間という感じで時間かけるべきなんだろうと感じました。
次回はこの続きで、活性化関数をシグモイドにかえて、前々回に説明した勾配降下法を使った式に変更し、その式の出し方も少し追いながら実装してテストできればと思います。
長野ディープラーニング同好会 #9
ディープラーニング同好会9回め開催しました。
第8回に引き続きで、ニューラルネット、ディープラーニングそのものについての解説ということでバックプロパゲーションとはなにをしているものなのか、を説明しました。
バックプロパゲーションの基本的な考えとして、教師信号とネットワークの出力の誤差をLとするとき、その誤差Lはネットワーク全体をfとすると重みWを変数とした関数の値、L=f(W)と考えられるので、その誤差Lを減らしていくのが学習、ということをあらためて説明しました。
そう考えると、初期値のWから誤差を減らすためには、fを微分して減る方向へWを動かす、ということを模式的なグラフを書くことで、感覚的に理解してもらえるよう、説明しました。
また、入力が1つしかないような非常に簡単なニューラルネットワークを考えてみて、それが数式で書くことが出来ること、多段になってもやはり数式で書けること、それをwで偏微分できること、なんかを説明しました。
その後、CNNの基本構造について説明しました。
これは畳み込み層の話を、先祖であるネオコグニトロンの考えから、特徴を抽出するためのフィルタであると考えれば良い、ということで説明しました。
今回はちょっとだけ数式を使って説明をしたのですが、このくらいだったら大丈夫だろう、という感じだったのですが、参加されたみなさんがどう感じられたのかはわからないのでちょっと不安です。
次回はこの続きで、パーセプトロンの学習方法を再確認して、そのアルゴリズムを実装したいと思います。
また、バックプロパゲーションへの入り口として、活性化関数をシグモイドやReLUにして1段だけのパーセプトロン(活性化関数が階段関数以外のものはパーセプトロンとは呼んじゃダメなのかな?)に拡張するところまでやりたいと思います。