kotamanegiの取り扱い説明書

のんびり趣味の事を書いてます。

セキュリティ・キャンプ2016に応募してみた!(後編)

後編の選択問題です。2,4,7,9を選択しました。

 

 

選択問題2:

1.SSL/TLS接続を確立している。このことから、Googleに似せた偽サイトを識別する効果や、検索履歴などといった個人情報を保護する効果が期待できる。
2.あまりにも長い文字列を検索するとerror 400を出す。このことで、バッファオーバーフロー系の攻撃を防いでいると考えられる。
3.ハッキングされた可能性があるサイトを表示している。このことで、利用者がウイルス感染したサイトにアクセスすることを防いでいる
4.検索ランキング決定のアルゴリズムを定期的に変更している。このことで、悪質なサイトがSEO対策などを駆使してランキング上位に表示されることを防いでいる。
5.存在しないサイトを表示した場合には特別なエラー画面を表示している。このことで、エラーの原因などが表示され、その情報が悪用されることを防いでいる。
6.大量に検索リクエストを送信するなど、不正なトラフィックが検出されると画像認証(Captcha)を要求する。これで、BOTによるDDoS攻撃などを防いでおり、またウイルス感染したパソコンの利用者に警告を出している。
7.googleの検索に表示される広告は審査されている。このことで、広告としてウイルスサイトが表示されてしまうのを防いでいる。
8.特殊文字(=とか'とか)が入力されると、エスケープ処理を行っている。これで、SQLインジェクションとかXSSなどを防いでいる。
9.(セキュリティ対策といえるのかはわからないけれど)Webブラウザーのバージョンに応じてサイトのデザインを変えている。
このことで、サポートされていない機能を使ってしまい、脆弱性を埋め込んてしまうのを防いでいる。

 

 

選択問題4:

#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#define  _SCL_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>
#include <utility>
#include <functional>
#include <cstring>
#include <queue>
#include <stack>
#include <math.h>
#include <iterator>
#include <vector>
#include <string>
#include <set>
#include <math.h>
#include <iostream>
#include<map>
#include <stdlib.h>
#include <list>
#include <typeinfo>
#include <list>
#include <set>
#include <cstdint>
#include <stdint.h>
#include <intrin.h>

/*
#include <Windows.h>
uint64_t rdtsc() {
return __rdtsc();
}

unsigned MemoryUsageMegaBytes(void)
{
MEMORYSTATUSEX m = { sizeof m };
GlobalMemoryStatusEx(&m);
return (unsigned)(((512 * 1024) + (m.ullTotalVirtual - m.ullAvailVirtual)) / (1024 * 1024));
}
*/
using namespace std;
string valid_order_brand[3] = { "BlueMountain","Columbia","OriginalBlend" };
string invalid_order_brand[2] = { "DandySoda","FrozenEvergreen" };
int main() {
FILE* fp;
fp = fopen("pyonpyon.rh", "rb");
if (fp == NULL) {
cout << "FAILED READING";//読めなかった場合
return 0;
}
/*
long long hoge_hoge = rdtsc();//最初のCPUクロックカウンタの値
*/
while (feof(fp) == 0) {
char Magic[2];
char Source[20], Destination[20];
char DataLength_base[4];
fread(Magic, sizeof(char), sizeof(char) * 2, fp);//Magic部の読み込み
fread(Source, sizeof(char), sizeof(char) * 20, fp);//Source部読み込み
fread(Destination, sizeof(char), sizeof(char) * 20, fp);//Destination部読み込み
fread(DataLength_base, sizeof(char), 4, fp);//とりあえずcharで読み込む
//c++なら
string st_Data;
string st_Source;
string st_Destination;
uint16_t DataLength = 0;
for (int i = 0;i < 4;++i) {
DataLength += (int)DataLength_base[3 - i] * pow(256, i);//変換
}
for (long long i = 0;i < DataLength;i++) {
//一文字ずつ読み込み -> Dataに収納
char hoge_hoge;
fread(&hoge_hoge, sizeof(char), sizeof(char), fp);
st_Data.push_back(hoge_hoge);
}
for (int i = 0;i < 20;++i) {
if (Source[i] != 0) {
st_Source.push_back(Source[i]);
}
if (Destination[i] != 0) {
st_Destination.push_back(Destination[i]);//char -> stringに変換
}
}
bool failed = false;
if (Magic[0] != 'R' || Magic[1] != 'H') {
failed = true;
}//Condition 1
string small_Source = st_Source, small_Destination = st_Destination;//下ごしらえ
transform(small_Source.begin(), small_Source.end(), small_Source.begin(), tolower);
transform(small_Destination.begin(), small_Destination.end(), small_Destination.begin(), tolower);
//小文字に変換完了
string valid_Source[2] = { "rise-san","cocoa-san" };
string valid_Destination[2] = { "chino-chan","chino" };
if (small_Source != valid_Source[0] && small_Source != valid_Source[1]) {
failed = true;//Condition 2
}
if (small_Destination != valid_Destination[0] && small_Destination != valid_Destination[1]) {
failed = true;//Condition 3
}
if (st_Source == "cocoa-san"&&st_Destination == "Chino") failed = true;//Condition 4
for (int i = 0;i < 3;++i) {
//Condition5を満たすか
if (st_Data.find(valid_order_brand[i]) != std::string::npos) {
goto ok;
}
}
failed = true;
ok:;
for (int i = 0;i < 2;++i) {
//Condition6を満たさないか
if (st_Data.find(invalid_order_brand[i]) != std::string::npos) {
failed = true;
}
}
if (failed == true) {
cout << "REJECTED" << endl;
}
else {
cout << "PASS" << endl;
}
/*
cout << rdtsc()-hoge_hoge << endl;//1回あたりのCPUサイクル出力
cout << MemoryUsageMegaBytes() << endl;//1回あたりのメモリ使用量出力
*/
}
/*
cout << rdtsc()-hoge_hoge << endl;//全体のCPUサイクル出力
cout << MemoryUsageMegaBytes() << endl;//全体のメモリ使用量出力
*/
return 0;
}
/*
メモリ使用量は19MegaByteで、これはプログラムの実行中に取った値と最後に取った値
が同じだった。だから、データ容量はあらかじめ確保されてると考えられる。
もしかしたら最初に入力データをすべて読み込んでるのかもしれない。
CPUクロック数は最終的に 8877096 になった。しかし、何回も実行していると 値が変わっていたので、実行時の状況に依存していると思う。こちらは、当然プログラムの実行中に取ったデータと最後に取ったデータでは差があった。

*/

/*

実行結果:

PASS

PASS

PASS

PASS

PASS

PASS

PASS

PASS

PASS

REJECTED

PASS

PASS

PASS

REJECTED

REJECTED

PASS

PASS

PASS

REJECTED

REJECTED

REJECTED

PASS

PASS

PASS

REJECTED

REJECTED

REJECTED

REJECTED

PASS

PASS

PASS

REJECTED

REJECTED

REJECTED

REJECTED

REJECTED

PASS

PASS

PASS

REJECTED

REJECTED

REJECTED

REJECTED

REJECTED

REJECTED

REJECTED

*/

 

 

 

選択問題7:

1.有線LANなら実際にケーブルをたどっていって、ケーブルに接続されている物の中に悪意ある第三者の物が混ざっていないか確認する。

2.ルータのアクセスログの中から、普段使われていないようなプロトコル(FTPとか)を使っている端末がないか確認する。

3.自分のIPアドレスのブロードキャストアドレスにpingを送り、戻ってきた中におかしいIPアドレスがないか確認する。

4.IPアドレスホスト部のところだけ変更したもの全てにpingを送り、本来戻ってきてはならないところから戻ってきていないか確認する

5.Netenumなどのツールを使って、全てのIPアドレスを調べてみる。

 

 

選択問題9:

サービス:インターネットと役所の窓口の両方から交付申請ができるようなサービスをつくる。

インターネットでの申込にはWEBサイトを使い、TLS/SSLを使って暗号化する。

ただし、インターネットでの申込であっても一度は役所の窓口に来てもらうようにする。

最終的には、地方の役所でマイナンバーカードを交付したマイナンバーの表を作り、それを国などが管理するデータベースに保存していく。

注意点:

1.WEBサイトには脆弱性を残さないようにする。

デバッグ用のデータをできるだけ残さないように注意し、ファジングツールなどを使って安全性を確認する。

予算があるならばCloudFlareなどの外部のセキュリティサービスを使うことも検討する。

2.1つのマイナンバーに2つ以上のマイナンバーカードを発行しないようにする。

カードの作成時にもうすでにマイナンバーカードが発行されているならエラーを出力するようにする。

当然ながら、人間の目でも定期的にチェックする。

3.マイナンバーカードはそのマイナンバーの持ち主が来た時に発行する。

その場で発行すると、紛失したり、マイナンバーカードを取り間違えるなどといったリスクが軽減できる。

さらに、二重申込なども未然に防げる。

4.マイナンバーカードを持つことに対しての注意点などを話しておく

紛失した時にどこに申請するか、何をしてはいけないかなどを伝えておく。

特に、パソコンを利用する人に対しては、ウイルス対策ソフトの導入をしてもらうようにする。

できればパンフレットを配布しておくのが理想。

5.マイナンバー情報はできるだけ暗号化した状態で使用する。

どうしてもハッキングというのは起こりうるので、もしハッキングされたとしても被害が最小限に抑えれるようにしておく。

人間はデータを暗号化し忘れることがあるから、ソフト側で暗号化しておく。

6.データベースにはアクセス制限をかけておく。

当たり前だけれども、パスワードには大文字や小文字、数字を必ず含めて十分複雑で長いパスワードを設定しておく。

データベース側ではログを取得しておき、不必要な操作を行ったユーザーに対して警告をしていく。

7.データの入れ間違えが起こりにくいようにする。

マイナンバーを2桁入れ間違えたとか、そういうミスを防げるように二重確認を義務付けておく。

 

 

応募内容は以上です。

来年以降は大学受験に向けてもきっと動き出すので、できれば今年参加したいところ。22歳まで参加の権利はあっても、チューターでの応募や参加はどんどん難しくなっていきそうな気がするから、できればまだ時間のある今のうちに参加が決まるといいんだけど、こればかりは運に任せるしかないっていう。

というか、そもそも全国大会に行ける日が来るんだろうかっていうね。

結果が出るまでもやもやするよーー!

 

kotamanegi.hatenablog.com