人に迷惑をかけるなのパラドックス

たまに、少しは人の迷惑を考えろという人がいる。

だがしかし、あなたに迷惑が掛からないようにすると、私にとってとても迷惑なことがおきる。
なぜ貴方の迷惑を解消するために、私が迷惑を被らないといけないのか。
少しは他人の迷惑を考えてほしいものである。


つまり、人に迷惑をかけるなという行為自体が、とてつもなく人に迷惑をかけている。
同様に、わがままを言うなという行為自体は、とてつもなくわがままである。

よって、人に迷惑をかけるなという行為自体が自己矛盾のブーメランじみた、パラドックスである。

もし、人に迷惑をかけるなという人がいたら、あなたのその意見がとてつもなく迷惑をかけているので、人に迷惑をかけるのは、やめてくださいといってあげよう。それが優しさというものだ。

日の丸を丸く描くんじゃねーよ。

みなさんは、日本国の国旗である日の丸、好きできすか?
私は大好きです。

ってことを書くと、このウヨクがーといってくる頭のおかしい人がいそうですが、個人的には、どちらかといえばリベラルな方なんじゃないのかと思ってます。

それでは、なぜ日の丸が好きなのか?
自国の国旗が好きで何が悪いという単純な理由だけではなく、
好きな理由をいくつか上げることができます。

なぜ日の丸が好きなのか?

好きな理由1

白い長方形に赤い丸。
実にシンプルで、美しいデザインだと思います。

引き算の料理と言われる日本料理や、盆栽、見えそうで見えない美少女のパンツみたいに、シンプルなところに美を見つけ出す日本人にふさわしいデザインだと思います。


好きな理由2

日の丸弁当がうまい。
白米に梅干しというコンボは最強です。
日本人として疑う余地がありません。


余談ですが、
ピザマルガリータ(マルゲリータ)も、緑のバジルと白いチーズと赤いトマトで、イタリアの国旗をかたどったデザインだそうです。
シンプルな国旗だとそれをかたどった美味しい食べ物が作られるのでしょうか。

好きな理由3

子供で簡単書ける

長方形の白い紙に、赤ペンで丸をでかくかけば完成です。
子供でも簡単にかけます。

もし、アメリカの星条旗や、シンプルながらマークがある中国やロシアの国旗をかけといわれたらけっこう大変です。

好きな理由4

よってグラフィックプログラムの入門に最適

長方形に丸、そして塗りつぶしというグラフィックAPIに必要なことがすべて詰まっています。
日の丸を書くコードはグラフィックAPIを学ぶhello worldのようなものでしょう。

<script>
	var canvas = document.getElementById('canv');
	var context = canvas.getContext('2d');

	context.beginPath();
	
	//四角形を描き
	context.fillStyle = "rgb(255, 255, 255)";
	context.fillRect(0,0,200,120);

	//円を描き
	context.strokeStyle  = "rgb(255, 0, 0)";
	context.arc(100, 60, 40, 0, Math.PI*2, false);

	//塗りつぶす
	context.fillStyle = "rgb(255, 0, 0)";
	context.fill();
	context.stroke();

</script>

もし、これがアメリカの星条旗を描けと言われたらと思うと、
あまりの難しさに初心者は卒倒します。
星マークとかは関数化したりしていい感じに逃げたいところですが、そうなるとhello world から外れてしまいますね。

ちなみに旭日旗は嫌いです

ちなみに旭日旗は嫌いです。
まずデザインがシンプルではありません。
単純に円に丸ではないので、子供とかは簡単に書くことができませんし、グラフィックプログラムの例題としても複雑過ぎます。
そして何よりも旭日旗弁当は、あまり美味そうには思えないところです。

旭日旗 弁当
https://www.google.co.jp/search?q=%E6%97%AD%E6%97%A5%E6%97%97+%E5%BC%81%E5%BD%93&source=lnms&tbm=isch

本題

このようにシンプルで美しい日の丸ですが、
最近、日の丸を円形で書く人たちがいます。

例えばAppleのサイト。国旗が円形でデサインされています。

http://www.apple.com/choose-your-country/


確かに円形にすることでおしゃれっぽく見えます。
星条旗や複雑なデザイン、シンボルマークをもっている国旗はとても綺麗に見えますが・・・



問題は日の丸にあります。
これです。


私は、これを何度見ても「ゲゲゲの鬼太郎の目玉の親父」にしか見えません。
最初見た時、これが日の丸であることを視認できませんでした。
なんだこの目玉の親父は? というか、なぜ目玉の親父がこんなところにいるんだ?きっと何か哲学的な意味があるに違いないと、深く深く考えこんでしまいました。


目玉の親父に似ているわけですから、せっかくだから吹き出しをつけて喋らせてみましょう。
おいっ 鬼太郎!


完全に一致。



この丸いのは他にもあって、
「速報版! 日の丸 F-35 航空観閲式 航空自衛隊 百里基地」の動画より


おいっ 鬼太郎!


補足:この場合、国籍マークであって、日の丸ではないのかもしれないが、目玉のおやじであることにかわりない。


と、いうわけで、円形で日の丸を書かれると目玉の親父にしか見えないです。
こういうデザインを見るたびに、毎回頭のなかで、「おいっ鬼太郎!」というフレーズが聞こえて一人笑いしてしまいます。
何あの人一人でニヤニヤわらっているの?と指をさされかねません。
大変危険です。

なので、日の丸は円形ではなく、できれば四角形で書いて欲しいと思っているのです。

太古の昔、メモリ空間は自由だった。

太古の昔、メモリ空間は自由だった。
好きなところにジャンプでき、自由に書き換えることもできた。


だが、その結果、解読不能な摩訶不思議なソースコードができあがった。
これではいけないと人々は立ち上がった。


gotoなどの無条件ジャンプは悪とされた。


だが、自由にメモリ空間は書き換えられた。
その結果、グローバル変数でまみれた不思議なコードが出来上がった。
これではいけないと人々は立ち上がった。


グローバル変数は悪とされローカル変数などが導入された。


だが、長いスコープを持つ巨大な変数があった。
スレッドで再突入されるコードがあった。
これではいけないと人々は立ち上がった。


その結果、クラスや名前空間によりもっと細かいスコープで管理されるようになった。


だが、煩雑なクラス定義が残った。
これではいけないと人々は立ち上がった。


その結果、無名関数やlamda構文やリフレクションなどの構文ができた。




プログラム言語の歴史は、
自由すぎるメモリ空間をいかに制限して使いやすくするか、
それと同時に、制限はするがそれでも高い表現力を維持させるにはどうすればいいかという、
矛盾しそうな気もする課題への挑戦だったと思う。

右派と左派って、真女神転生で例えるなら、右派がロウで、左派がカオスだな。

右派と左派って、真女神転生で例えるなら、右派がロウで、左派がカオスだと思う。


右派->ロウ
左派->カオス


規律のためなら死んでもいいのと、自由のためなら死んでもいいの違い。
規律ある社会や国家のために死んでもいいのと、個人の自由のためなら死んでもいい。みたいな。
個人の自由より秩序を優先と、個人の自由を何より優先。みたいな。


例えば、家に否定的な左派がなぜ同性婚に賛同するかというと、
本人たちがそれを望んでいて、特にデメリットがないならまあいいんでねという、個人の自由を何より最優先するからだと思う。


なんで左派が家とかの古くあるコミニティに否定的かというと、
それを窮屈に感じる人がいてそこから逃れたい人がいるならば、その個人の逃れたいという自由を最優先したいからだと思う。


ちなみに、左派が表現の自由とかを最優先するかというと、
それは云わずもがな言いたいことを言う自由を優先したいからだ。ということは、逆に、右派が表現規制などを行い社会秩序を守りたいのもなんとなくわかるよね。


ようするに、左派は自由ありきなわけだ。だから、リベラル(自由主義者)なんだね。
言葉というのはよく出来ているものだ。




右派からすれば、左派は自分勝手な身勝手な奴らで、秩序を破壊する危険なやつらだし、
左派からすれば、右派は口うるさく自由を束縛する、人間の自由を奪う危険なやつらだ。
お互いが互いの価値観を理解し合うのは無理というものだろう。
お互いの価値観に違いがあるのを認めるぐらいしかないだろう。




どちらも、極限まで傾くと頭おかしい集団となる。
例えば、
右派だと、ナショナリズムとかで外国人とかを迫害し始めたり、検閲や全体主義を始めるだろうし、
左派だと、国家とか秩序をないがしろに始めるだろう。
これもまた、女神転生で、ロウを極めても頭おかしい集団になるし、カオスを極めても頭がおかしい集団になるのと一緒だ。



右派も左派もどちらも極めた社会はディストピアそのものだ。




だから、できるならばどちらにも傾かないニュートラルルートを歩んでいきたいものだ。
右派も左派も、あいつら何マジになっているんだと馬鹿にして指差して笑えるぐらいになりたい。
そして、右派からは左派だと言われ、左派からは右派だといわれる地点にいたいものだ。
その地点がどちらにも傾かないニュートラルルートだと僕は信じる。



右派を極めた頭おかしい奴ら、左派を極めた頭おかしい奴らをすべて笑って弾き返すニュートラルでいたいよね。

ばれないプロセスの立ち上げ方を考えてみよう

監視が厳しい環境でもばれずに任意のプロセスを立ち上げることができるだろうか?
システム監視が厳しく、起動しているプロセスやポート等が常に監視されているシステムがあったとして、その監視をすり抜けて任意のプロセスを立ち上げることはできるだろうか?

一見無理だと思うかもしれないが、実はできなくもない。
今回は、ばれないプロセスの立ち上げ方を考察してみよう。


なお、今のところどうしても1度はroot権限が必要である。(落胆しないでね)

攻撃方法:apacheモジュールへの寄生プロセス

結論から言うと、隠したいプロセスをapacheモジュールで実装する。


apacheモジュールとして動作しているから、psしてもapacheプロセスしかでてこない。
apacheがlistenしてくれているので追加の通信ポートが不要である。
apacheが外部と通信するのは当然のことなので何もおかしいことはない。
たいていの監視をすり抜けられる、完璧な隠れ蓑である。


もちろん、この方法はモジュールやプラグイン方針を採用しているすべてのソフトで使うことができる。今回、apacheを取り上げたのは、通信しててもおかしくないソフトウェアで、モジュールがあり広く使われているということでapacheを選択した。


何か命令を送りたい場合は、http/httpsリクエストの中に特殊なヘッダを作り、そのヘッダがあれば命令を実行するなんてことにすれば完璧である。

GET /foo HTTP/1.0
Host: foo
Bar: nazonazo      <<これ
Connection: close


通常、ヘッダはログには記録されないため、ログだけ見る限り普通のアクセスと見える。
また、秘密のヘッダがわからなければ、プロセスは動作しないとなれば発見は遅れるだろう。
さらに、https通信であれば、ヘッダも暗号化されるし完璧である。
なんという恐ろしいことだ。


こんなに便利ならクラッカーは使っていないの?というと、
実は、既にapacheに寄生する手法を利用したマルウェアが存在する。

Darkleech Apache Module
http://www.atmarkit.co.jp/ait/articles/1308/05/news002_2.html
http://www.atmarkit.co.jp/ait/articles/1303/25/news122.html



まー、そりゃ誰だって考えつくよね。apacheなどのプロセスに寄生させてしまえというアイディアはね。

apacheのモジュールは、環境も整っていて簡単に作れるので、この機会に遊んでみよう。
くれぐれも自分のサーバだけで、遊ぶようにね。

不信なapacheへの対策:httpd -M

apacheには、モジュール一覧を見る機能がある。
これをつかって、怪しいモジュールがないかを確認する方法がある。

$ httpd -M
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)

これで不審なモジュールがなければ安心、・・・と思うかもしれないが、この方法には穴がある。

不信なapacheへの対策への対策:ラッパー

攻撃と防御が頻繁に繰り返されてきたwindowsでは、ダミーwinsock.dllをつかった攻撃がある。
winsockへのラッパーdllを作ることで、攻撃を行う。

winsock.dllを一度どけて、_insock.dllとリネームし、自分が作ったwinsock.dllを差し込む方法である。
この方法ならば、単純な名前比較は意味を成さない。

では、_insock.dllなどへ既存のモジュールがリネームされているかどうかを調べればよいかというと、
オープンソース環境下ではそうとも言えない。

_insock.dllとするのは、winsockのソースコードが無いため、仕方なくラッパーを作っているだけである。
もし、ソースがあれば、完璧なものを用意できるのでリネームする必要すらない。

つまり、既存の .so モジュールのソースをコピペして、やりたい処理を追加したものを準備できれば、それを上書きコピーで動作させることができるだろう。
よって、単純な名前比較は意味を成さない。

じゃあどうすればいいんだよ!?

侵入されてrootを取られたら\(^o^)/と思うしかない。
クリーンインストール以外に道はない。

そうされないためには、ネットワーク構成上 ルーター置いて、必要なポートだけフォワードして、 SSHVPNした環境 or IP範囲制限のみで可能などの地道な対策をすることになるだろう。

幸いにも、apacheのモジュールを追加するには、apacheの設定ファイルやモジュールを書き換えなければならず、それをするには、root権限が必要である。
rootを取られるといった失態がなければ、ばれないプロセスを立ち上げることは多分不可能である。

もしかすると、 /home/foo/.***/ とかに拡張モジュールを置けるような親切なソフトウェアがあるかもしれないが、それは設計が間違っているのだ。そんなソフトウェアは使わないのが一番である。

まとめ

apache寄生まできたら次は、kernel寄生でもするのだろうか。
確かに、kernelもモジュールの集合体である以上は理論上可能である。
作るのは大変であろうが、なんでもできるし発見を遅らせることもできるだろう。

驚くようなソフトウェアが作られるかもしれない。
それはとても面白そうだ。

全能の逆説パラドックスの考察

好きなパラドックスの一つに、全能の逆説パラドックスがある。

全能者は自ら全能であることを制限し、全能でない存在になることができるか。
http://ja.wikipedia.org/wiki/%E5%85%A8%E8%83%BD%E3%81%AE%E9%80%86%E8%AA%AC

問「全能者は誰にも持ち上げられない石を作ることができるか?」
作ることができるならば、誰にも持ち上げられ石を持ちあげられないから、全能者ではないし、
作ることができないならば、そもそも全能者ではない。

wikipediaによると、いろいろな推測がされている。とても面白い。

また、以下の様な問がある。
問「全能者は自ら作った世界の法則に縛られるのかそうでないのか。」
(例:全能者は、内角の総和が180度でない三角形を作ることができるか?)

自分なりにいろいろ考えたが、それなりに納得の行く結論に達した。

rtiなりの全能の逆説パラドックスに対しての答え

問「全能者は誰にも持ちあげられない石を作ることができるか?」
問「全能者は、内角の総和が180度でない三角形を作ることができるか?」

答え「全能者は、それらすべて作成できると思う。」


全能者は内角の総和が180度でない三角形も作れるし、誰にも持ちあげられない石を作ることができる。
ただし、やった瞬間に世界の法則が壊れるので、全能者が創造した世界が崩壊する。



わかりやすいところで、誰にも持ちあげられない石を作ってしまった場合を考える。

誰にも持ちあげられない石とは、とてつもなく重い石だろう。
誰にも持ちあげられないわけだから当然である。


誰にも持ちあげられない石とは、怪力を持っている人だけではなく、パワードスーツを着たような人にも持ち上げられてはいけない。
誰にも持ちあげられないわけだから当然である。


誰にも持ちあげられない石は、クレーン車や、果てはロケットなどでも持ち上げられてはいけない。
誰にも持ちあげられないわけだから当然である。


誰にも持ちあげられない石は、地球の引力でさえも、その石を支えてはいけない。
誰にも持ちあげられないわけだから当然である。


絶対に負けてはいけないのだ。


それは、あらゆるものより重い石だろう。
あらゆるものより、重いということは、当然ブラックホールより重い石になるだろう。
ブラックホールの力に負けるようでは、誰にも持ちあげられない石ではない。


多分それは、宇宙が崩壊するほどの重さではないのだろうか。
その巨大な重さで、すべてのものは壊れてしまうのではないか?


いわば、root で rm -rf / するみたいな感じに似ている。
(dd if=/dev/null of=/dev/sda や format c: でもいい。)


全能者は、誰にも消すことができないファイルを消すことができる。
何でもできる全能者であるから当然である。
ただし、その結果、自分の世界の法則を修正不可能なぐらいに捻じ曲げてしまうため、世界が崩壊するのではないか。


崩壊した世界では、全能者は全能者ではない。
誰にも持ちあげられない石は全能者にも持ちあげられない。
よって、誰にも持ちあげられない石が世界を壊すのを止めるすべはない。
起動ディスクが壊れたOSが立ちあげられないように、自分の能力でも止められないわけだから、その世界は崩壊するのではないか。
(宇宙の法則が乱れる! or 破壊するもの)


こうなると、全能者にできることは、トラップにひかかった人が泣きながらOSを再インストールするように、涙目になって別の世界を作るぐらいかな・・・?

Linuxでアプリケーションやユーザごとに、異なるdefault gateway を割り当てる変態ルーティングの方法

Linuxで、アプリケーションやユーザごとに、異なるデフォルトゲートウェイを割り当てたくなる時があります。
普通は、優先度とかで自動で切り替えとか、そーゆー感じですが、


そうではなくて、


ユーザAは、デフォルトゲートウェイ1を必ず使い、ユーザBは、デフォルトゲートウェイ2を絶対に使う。
プロセスAは、デフォルトゲートウェイ1を必ず使い、プロセスBは、デフォルトゲートウェイ2を絶対に使う。


そんな風にしたい時があります。
まあ、人生は長いですから、そういう時もあるのです。

ネッツ

PC 192.168.0.10 ---> HUB -->gateway1 192.168.0.100 
                         -->gateway2 192.168.0.200 

ユーザ user_proxygw は、192.168.0.200 を使い、
それ以外は、 192.168.0.100(default gw) を使うというのを考えてみます。

初期設定(前提条件)

adduser user_proxygw
ifconfig eth0 192.168.0.10
route add defualt gw 192.168.0.100

route -n
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0         192.168.0.100   0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

遊び方

#
#まずはなにはともあれ、パケットを転送するように設定する.
echo 1 > /proc/sys/net/ipv4/ip_forward

#
#ルーティングの名前を追加する。
#201とかの番号だけではわからなくなるので、 proxygw という名前を割り振ります。
#user_proxygw が使うルーティングルールだから、proxygw と命名します。
vi /etc/iproute2/rt_tables
201     proxygw


#
#ルーティングを設定します
#パケットに1というフラグが立っているものは、 proxygw ルーティングルールを利用する。
#proxygwルーティングルールのデフォルトゲートウェイは 192.168.0.200 である。
ip rule  add fwmark 1 table proxygw 
ip route add table proxygw default via 192.168.0.200

#間違ったら、 addをdelに変えて、 ip rule  del fwmark 1 table proxygw  とかすると消えます。
#現在の状態を確認するには、 ip rule show とか、 ip route show とか、やるといいらしいです。

#
#パケットに1というマークを建てるために、変態御用達のiptableの mangleルールを使います。

#ユーザ user_proxygw が作成したパケットがきたら、 1というマークを建てる。
iptables -t mangle -P OUTPUT ACCEPT 
iptables -t mangle -A OUTPUT -m owner --uid-owner user_proxygw -j MARK --set-mark 1


#間違っちゃったら初期化してね
#(iptablesを使うときは、コンソールへのアクセスができることを確認してからやろうね。ハマって真っ青にならないように)
#iptables -F
#iptables -F -t mangle

ようするに、以下の様なドミノ倒しが実行されます。

iptablesで、ユーザ user_proxygw が作ったパケットならば 1 というマークを立てます。
iptables -t mangle -A OUTPUT -m owner --uid-owner user_proxygw -j MARK --set-mark 1


1というマークがついていたら、proxygw というルーティングルールに移動します。
ip rule add fwmark 1 table proxygw


proxygw というルーティングルールのディフォルトゲートウェイは、192.168.0.200 です。
ip route add table proxygw default via 192.168.0.200


だから、 ユーザ user_proxygw が作成したパケットは、 192.168.0.200 を利用します。
逆に、それ以外のユーザが作ったパケットは、 iptables でマーク1を建てていないので、普通のデフォルトゲートウェイ 192.168.0.100 を利用します。

確認方法

su - root (or 適当なユーザ)
traceroute -n 8.8.8.8

192.168.0.100を経由するはずです。


su - user_proxygw
traceroute -n 8.8.8.8

192.168.0.200を経由するはずです。

プロセス単位で切り替える方法は?

実は、無理です。

セキュアOSとかだと lidsconf コマンドでフラグが建てられるそうです。
http://www.atmarkit.co.jp/fsecurity/rensai/lids12/lids02.html

普通のLinuxはそうはいきません。
ただし、uid単位(噂ではpid単位でもできるそうだが)、gid単位でできるそうなので、
制限したいプロセスを実行するユーザを限定すれば可能です。

例えば、squidは proxyユーザとかで動きますから、
proxyユーザのdefault gatewayをこの方法で閉じ込めてしまえば、squidを利用する人たちをこの方法で別のgatewayに転送できます。

問題は、curl などのユーザが特定できないコマンドです。
これは無理かもしれぬ。
方法を知っている人がいたら教えてください。

ローカルに、この方法で隔離したsquidを置いといて、そのsquidを利用してもらうとか・・・?
または、これらのコマンドを使うときは、制限したユーザになってから実行してもらうなど?
なかなかめんどくさそうです。