カメヲラボ

主にプログラミングとお勉強全般について書いてます

後始末(最終回)

とんでもない結末になってしまったPKU1145祭り。やねさんは多忙だし、私もちょっと責任も感じちゃったりして、PKU OnlineJudgeの主催者にセキュリティホールのレポートと、記録・アカウントの削除依頼をすることにした。

まずはじめに。私がこの記事を公開しているということは、問題の穴は無事塞がったということです。ヨカタヨカタ。っちゅうわけで、最後の25byteコードについて簡単に解説しておきます。


このトリックは、サーバにあるかもしれない他人のファイルを横取りするものではありません。一旦コードを送信すると、Judgeプロセスは一度キューに入ります。Judgeはひとつずつ、/Temp/RunID/ディレクトリ内で展開され、一通り終わると完全に消去されますから、他人あるいは自分が過去にsubmitしたコードを読むことはできません。


ではどうするか。


これは、プログラムを通してC:/Windows/Temp/ディレクトリ内にファイルを書き込むことが可能であるというセキュリティホールを突いて、正解コードを書き込んだファイルをこのディレクトリに作成します。


例)


#include
main(){
FILE *fp;
char a[]=" --- Correct Answer Code --- ";
fp=fopen("/Windows/Temp/a","w");
fprintf(fp,"%s",a);
fclose(fp);
}
このコードを一旦送信します。当然WAが出ますが、このとき正解コードが書かれた"a"というファイルを、/Windows/Temp/に作成します。


あとは、


#include"/Windows/Temp/a"
と書いたコードを送信すれば、25byteコードがAcceptされます。


事が済んだら、


#include
main(){
remove("/Windows/Temp/a","w+");
}
というコードをもう一度送信して完了。


2番目の手順で、消費メモリを抑えたコード(参考id:kurimura:20051208)で8kのコードを書き込んでいれば、めでたく究極のコード


Code Length: 25byte Memory: 8k
がAcceptされることになります。もちろんここまでやった人はいないので、幻の記録ということになりますが。


主催者にも、この様な説明を添えてレポートしました。そして最後に「もしこの様な不正な記録が問題でしたら、アカウントごと消去してください」と、他に25byteでAcceptされている人に断りもなく書いておいたのですが、実際見ていただければ分かるようにアカウント停止や記録の削除はされていません。


おぉ、なんて心の広い!!
と思ったのですが、よくよく考えてみると最初にレポートメールを送ったときの返信は「さんきゅー、あとで見とくわ」でしたし、あんまり深刻に見ていないようでした。1000番問題なんかも、statusのログをよく見てみると我々と同じようなことをしていた形跡がありますし、記録自体はどうでもいいのかもしれません。


メールの最後はこう締めくくられています。


Thank you for finding that.
And if you find anything else that not secure enough, please tell me.


祭りは終わりましたが、興味のある人はまだまだPKU JudgeOnlineで遊んでください。そして、もし深刻なセキュリティホールを発見したときは、必ず報告してあげてくださいね。


私はこれからも、息抜きにここでプログラムを書こうかなと思っています。もちろん正攻法(笑)で。よく見てみると、結構日記のネタにできそうな問題が転がっている。グラフ理論あたりの話は、ここから問題を選んですれば良さそう。


というわけで、たまに[PKU0000]みたいな日記を書くかもしれませんが普通にプログラミングの話です。
それでは、また。