仕様を変えられる言語bittnのメモ
本記事は、言語自作アドベントカレンダーの10日の記事です。 このアドベントカレンダーは数年前から知っていました。執筆者の中に憧れている人が多いので、拙い記事ですが参加できて光栄です。
私は少し前から、bittnと言うプログラミング言語を作っています。bittnはカスタマイズできる言語があれば面白いと思い、2ヶ月ほど前に作り始めた言語です。
目次
- 概要
- メリットとデメリット
- デメリットに対する対策
- 具体的な仕様
- 実装方法
- 最後に
概要
bittnは、言語の仕様・動作を設定ファイルに記述・使用できるプログラミング言語です。
殆どの開発環境(vim,tmux...)には、設定ファイルというファイルが存在し、そこで動作をカスタマイズできます。
プログラミング言語も、そのような特徴を持っていれば、簡単なDNSを作る場面などで役立つと思います。
メリットとデメリット
- メリット
- 言語作成のプラットフォームとして使用できる
- 自分好みの言語を使用できる。
- デメリット
- 他の人のコードと合わない
- チーム開発が難しい
デメリットに対する対策
そこで、デメリットに対する対策は以下のように実装していく予定です。
チーム開発では、同じ設定ファイルを共有できれば問題ないと思います。そこで、設定ファイルをディレクトリごとに設定できるシステムも作成すれば解決すると考えています。
具体的な仕様
構文の設定は、以下のような設定ファイルを想定しています。
class NumericParser < Parslet::Parser idens = ["print"] root(:code) rule(:space){ str(" ") } rule(:spaces){ space.repeat(1) } rule(:space?){ spaces.maybe } rule(:return_mark){ str("\n") } rule(:returns){ return_mark.repeat(1) } rule(:return?){ returns.maybe } rule(:sprt?){ (return_mark | space).repeat(0)} rule(:chars){ str("a") | str("b") | str("c") | str("d") | str("e") | str("f") | str("g") | str("h") | str("i") | str("j") | str("k") | str("l") | str("m") | str("n") | str("o") | str("p") | str("q") | str("r") | str("s") | str("t") | str("u") | str("v") | str("w") | str("x") | str("y") | str("z") | str("A") | str("B") | str("C") | str("D") | str("E") | str("F") | str("G") | str("H") | str("I") | str("J") | str("K") | str("L") | str("M") | str("N") | str("O") | str("P") | str("Q") | str("R") | str("S") | str("T") | str("U") | str("V") | str("W") | str("X") | str("Y") | str("Z") | str("0") | str("1") | str("2") | str("3") | str("4") | str("5") | str("6") | str("7") | str("8") | str("9") | str(" ") | str("!") | str("\\\"") | str("#") | str("$") | str("%") | str("&") | str("\\'") | str("(") | str(")") | str("-") | str("^") | str("@") | str("[") | str(";") | str(":") | str("]") | str(",") | str(".") | str("/") | str("\\\\") | str("=") | str("~") | str("|") | str("`") | str("{") | str("+") | str("*") | str("}") | str("<") | str(">") | str("?") | str("_") | str("\\n") | str("\s") | str("\t") } rule(:string) { str("\"") >> chars.repeat >> str("\"") } rule(:var) { match("[a-z]") >> match("[a-zA-Z1234567890]").repeat } rule(:integer) { match("[0-9]").repeat(1) } rule(:code) { (line >> str("\n")).repeat(1) } rule(:line) { func | assign | value | sprt? } rule(:func) { idens.map{|f| str(f)}.inject(:|) >> block } rule(:block){ block_value | block_lists } rule(:block_value){ str("(") >> sprt? >> line >> sprt? >> str(")") } rule(:block_lists){ str("{") >> sprt? >> code >> sprt? >>str("}") } rule(:value){ string | var | integer | func } rule(:assign) { var >> space? >> str("=") >> space? >> value } end
動作の設定・読み取りは実装中です。
実装方法
使用言語は、Rubyです。
構文の設定部分を処理しているライブラリにはparsletを用いています。
動作の設定には、中間言語のObjectをユーザに定義させることを検討しています。
具体的には、ソースコードをユーザの設定ファイルに記述されたparsletのルールでパースしています。
これからの作業予定
設定ファイルの管理マネージャ・中間言語への変換・実行部分は順次実装していきます。
今後の展望
この言語は、DSLのような簡易なプログラミング言語を作成する際のプラットフォームとしても応用できると考えています。
最後に
Githubのリンクは下に貼りました。アドバイスを頂けたら、嬉しいです。また、投稿が遅れてしまい申し訳ありませんでした。
--- 自己紹介 --- @reeetok99709
プログラミングができるようになりたいカワウソ。
3年前からプログラミング言語を作っている。
都内の中学校に在学。
趣味は競技プログラミングとCTF。
【CODEBLUE2019】基調講演:核兵器とハッキング
1. Cyber is contested; This Causes Problems
- サイバーは様々
- サイバーは確立されていない
2. Cyber and Nuclear are Different
- 結構違う
- 核だと、被害が大きい
3. Cyber Threats Are Diverse
- サイバー脅威は一口にまとめられすぎている
- 大事なのは、意図
- 核を起動しようとしたりする
- 防衛レーダーを止めようとしたりする動きなど
4. Air Gapping is Not a Panacea
- ネットワークを隔離すれば安全→間違い
- 例として、潜水艦のシステムでも隔離しているから安全だといっている人がいる
- でも、誰かがコードを書いている→もしかしたら、アメリカで書かれているかもしれない
- 無線が繋がったら、システムを妨害できる
- 継続的に防止することが大事
5. Some Cyber Challenges are Inherent
- ソフトウェアは脆弱性を持っている
- 間違って発射されないように、安全に
- システムの複雑化→シンプルにするという考え方
6. Humans Are a Key Part of the Challenges
- 問題の起因は人間
- 働いている人がマルウェアに感染する
- 人間を突破口としたハックが多い
- ソーシャルエンジニアリングは非常に興味深い
7. Espionage and IP theft is the biggest risk
- スパイについて考える
- サイバーになるとリスクが大きくなる
- 手作業での複製ではないので、複製はとても簡単
- USBメモリなど
8. Deterrence Can Play a Role, But...
- 核に対する抑止が40年になると、有効にならない
- 法で抑止はできる
- 政策の文書も狙われるかも
9. Cyber Threats are Most Dangerous in a Crisis
- 2010年に2つのロケットが撃たれたとツイートされた例がある
- 戦争中だったら。。
- アカウントをハッキング
10. Viewing Cyber as "Separate" is Unhelpful
- 実際の戦争ではない
- 境界は曖昧と考えるべき
- サイバーは最新の道具を組み合わせる
- 新しい高度な非核兵器
- 戦闘の中での役割
- 宇宙の武器、AI
- サイバーは幅広い
11. An Emerging Norm of "Hacking the Bomb"?
- 核施設がサイバーのターゲット
Conclusion and Recommendations
- サイバーの意味を理解する
- 人間は関わっている
- 核はサイバーに貧弱
- サイバーと核の関係者は対話するべき
- サイバーがわかる人を配置するべき
- 国際的な枠組みが必要
感想
核兵器とサイバーを結びつけた、興味深い講義だった。
核施設は、サイバーに貧弱ということで、対策をする必要があると思った。
【CODEBLUE2019】CoinbaseとFirefoxの0-day
CoinbaseとFirefoxの0-day Presented by フィリップ・マーチン
2019年6月17日、コインベースは、同社の従業員を狙い2つのFirefox 0dayを利用する攻撃者の試みを検知し、ブロックした。暗号通貨業界は、このような複雑巧妙化した攻撃が続くことを予測しなければならない。そこで、優れた防御姿勢を持ったインフラを構築し、私たちが確認している攻撃の情報をお互いに共有して連携することで自らを守り、暗号通貨経済を支持することができる。そこで本発表では、0 day 攻撃、コインベースが検知し対応した方法、将来このような種類の攻撃に対し周到に準備する方法について、コインベース社の情報セキュリティ最高責任者(CISO)フィリップ・マーティン氏が深く解説する。
- 00 Intro
- 攻撃の概要
- 十数社の暗号通貨の会社の役員クラスの200人を標的とした
- 個人情報は、ソーシャルエンジニアリングによって収集された
- 攻撃の概要
- 01 Attack Timeline and Overview
- Phase 1 Recon(偵察)
- 約200人をリストアップし、個人的なメールアドレスを集めた
- 企業メールではなかったため、対策ができなかった。
- Phase 2 Weaponization(情報の武器化)
- Phase 3 Delivery
- 二つの0-day
- CVE-2019-11707
- CVE-2019-11708
- よく準備されていた
- 攻撃者は自分で攻撃方法を事前に発見していた可能性がある
- 2つめは、新しいものだった。
- 攻撃者は自分で攻撃方法を事前に発見していた可能性がある
- 二つの0-day
- Phase 4/5/6 Exploitation Installation & C2
- Phase 7 Actions on Target
- 実際に攻撃者がどのような攻撃をしたのかはっきりと分かっていない。
- エクスプロイトされた後、20分後に感知し、対応をした
- 検知されていなかったら、どうなっていたかはわからない。
- エクスプロイトされた後、20分後に感知し、対応をした
- 実際に攻撃者がどのような攻撃をしたのかはっきりと分かっていない。
- Attacker Info
- 2016に活動を始め、0-day攻撃をいくつかこなしている。
- ポーランド、日本では、報告があったが、英語ではなかった。
- 経験と資金が豊富だったと考えられる
- Phase 1 Recon(偵察)
- 03 Response and Lessons Learned
- Visibility
- 可視化が重要
- 攻撃に対しては、注力していたので、対応ができた
- Alert
- 高速なレスポンス
- アラートが増えると、信頼性がなくなるため、アラートは精度がよく、行動に移せるものである必要がある。
- Visibility
感想
とても巧みな、攻撃だったことに驚かされた。 また、0-dayの攻撃に対して、20分で対応した点にも、非常に驚いた。
攻撃が起こる前から、精度の高いアラートや、練習をしていることで、実際に起こった場合にも、迅速に対応できたのだと思った。