「バイトコード」を含む日記 RSS

はてなキーワード: バイトコードとは

2022-07-22

anond:20220722012116

まさに仮想マシンですね

スマートコントラクトバイトコードコンパイルされたものブロックチェーンに記録され、それがEVMというVM上で実行されるので

原神動かすためには億円単位のガス代がかかるかもしれないですね

ブロックチェーンOSを作るwww

twitterグーグルエンジニアが笑ってる

ブロックチェーン界隈は邪悪人間が多いためか、ブロックチェーン否定的ITエンジニアが多いのだけど、とてももったいないことだと思う

邪悪人間は嫌いになってもいいけど、ブロックチェーンのことは嫌いにならないでほしい


ちなみにブロックチェーンOSは作れます

イーサリアムを作ったヴィタリックさんは、イーサリアムのことを「ワールドコンピュータ」と呼んでいます

コンピュータというのは、記憶領域と入出力装置を兼ね備えた演算装置のことです

ブロックチェーンはこれらを持っています

記憶領域ブロックチェーンブロックの部分が担っており、演算装置マイニングマシンが担っています

入出力の出力の部分は、演算装置計算して記憶領域に格納した結果をこちから読み取り行くことで実現でき、

入力の部分は「オラクル」と言われることもあるけれど、データブロックチェーンに流しこむことで実現できます

ブロックチェーン同士をつなぐブリッジ一種の入出力と言えるでしょう

まり、これら記憶領域演算装置を持つブロックチェーンは、コンピュータなのです

比喩ではなく、定義上、コンピューターなのです

コンピュータやらせたいことはスマートコントラクトというプログラムコードに書きます

チューリング完全だそうです

そのコンピュータを操る基本ソフトであるOSは、ブロックチェーンに組み込まれているので、ブロックチェーンを作るということはOSを作るということなのです


普通コンピュータ場合フォルダの中身を見るのにエクスプローラーを使いますが、ブロックチェーンにもエクスプローラーはあります

イーサリアム場合はイーサスキャンというものが有名です

ブロックの中身を見たり、スマートコントラクトコード(ソースコードが公開されていない場合バイトコード)を見たりすることができます

このエクスプローラーブロックチェーン自体が備える機能ではないけれど、ブロックチェーンコンピュータっぽいことが分かるのではないでしょうか

ちなみに、スマートコントラクトコンピュータインストールするアプリに相当するでしょう


しかしこのコンピュータには大きな欠点があります

処理スピードものすごく遅いのです。記憶領域も貧弱です

個人的には、20年前のパソコンより遅いと思っています

それでも、コンピュータコンピュータです

まだ登場して間もないのだから、遅いのはしょうがないです

web1.0が登場したころ、そのあまりの遅さゆwwwのことを「world wide wait」と揶揄する人もいたそうです

webはその後劇的に速くなったので、ブロックチェーンも速くなるかもしれません


話が長くなりましたが、言いたいことは、ブロックチェーン詐欺ツールではなく、ただの技術です、ということです

現状、詐欺を支える技術となってしまっている部分もありますが、技術自体ニュートラルです

テストネットであればお金をかけることなトークン使ったりコントラクト書いたりできるので時間がある人は遊んでみてください

2021-05-22

KotlinなどがそうですがJavaJava vmの違いがわかりますか?

バイトコードJAVA VMならどんな言語でも動くよね

そういえばバイトコードが86ならどんなCPUでも動くよね・・・

言語コンパイルしてJAVA VMにあわせるのと86にあわせるの

なにがちがうかりかいができないJITって知ってる?となったとき

C言語エンジニアからJava vmというCPUって事でしょC言語と何が違うのか理解ができない

2020-10-21

[]オカルト死すべし

PHPでの文字列ではシングルクォーテーションとダブルクォーテーションがありそれぞれ利用用途は違うのだが、シングルクォーテーションに寄せたいという提案があった後に「パフォーマンスが良いから」って言われると「仮にお前そうだとして、一つのリクエスト片す時にシングルクォーテーションかダブルクォーテーションかでどれくらいレスポンス速度やメモリ消費量変わるから分かって言ってんのか、ああん?」

と思いがち。

つうか同じ文字列ならば本来同じバイトコードに変換されるはずなので速度差なんか無えだろ、本質的には。

もっと真っ当な理由出してくれよ……

2020-07-24

ちょっとちがうけど

Dの音をこうだしたいか

バイオリン右に

あと、こうして こうして

みたいな話はある

IntelCore i7ようとCore i5ようとXeonようではそもそもコンパイラが吐き出すコードも変えることはできるが、

人がコードのものかえることもできる。

積んでいる命令セットの違いごとにアセンブラを変えておくことができる

それをC++から呼び分けていく いまJavaバイトコード勉強している別の言語では1ど作ったつぎはJava シンプル構造VM

Googleと同じことをすればいい。ARTと同じものをつくればいい。ここは規模があまり大きくないから ひとりで 勉強がてらつくれる おもしろい でも ひとりでやった実例が ふえていくと

みんなにも できるんだ という自信が増える

 

ようやく 人数がそろってきている 層が あつくなっている

2020-07-22

まぁ 失業して丸1年 これでも 優秀なプログラマーだったはずなんだけどな いらねーんだろうな

どういうふうに書くかっていうので かわるからな、国語あら 国語

ここではきものをおぬぎください

というのと同じことがC言語でもJavaでもおきえる

とくにCやPythonはそういう書き方を好むこんどはJavaバイトコード勉強しているけど

いらないもんね勉強なんて

2019-06-25

「それでも女は下方婚しない」という言葉意味など無い。

強いて言えば、ロボット特定アルゴリズムに反応して「それでも女は下方婚しない」と書かれたPostリクエストサーバー送信しているだけだ。

ロボットには「それでも女は下方婚しない」という言葉意味はわからない。

バイトコード(U+305D U+308C U+3067 U+3082 U+5973 U+306F U+4E0B U+65B9 U+5A5A U+3057 U+306A U+3044)を、

Postリクエストのボディに詰め込み送信しているだけだ。

2018-01-21

人力でソースを綺麗にする時代もそのうち終わるのかな

バイトコード変換後の実行効率意識したプログラムは、一部を除いてほぼ時代遅れになった

DeepLearning様に「真似したいシステムURL」を投げたら大体のプログラムテスト作ってくれる時代に早よならんかなあ

2016-06-17

1.0から学ぶJava

タイトルを見て釣られクマーな皆さんこんにちは

ホッテントリメーカーで作るような煽りタイトルって、みなさんもう見飽きてると思うんですよね。

今調べたらホッテントリメーカー2008年だそうで。どうりでねー。古臭いなーと思いましたよー。

「一から学ぶJava」ってのをね、1.0にするだけでこんなに素敵なタイトルになるんだから面白いですねー。

タイトルを思いついただけだったんですけど、思いついたらやっぱりちゃんと中身も書かないと行けないじゃないですか。やだー

面倒くさいんですけどね。ちょっと1.0から学んでみましょうか。

Java 1.0 1996年1月23日

Javaの1.0がリリースされたのは1996年1月23日ですね。発表されたのが1995年5月23日でJavaの誕生日といった場合にどちらを取るかで揉めることがあります。

かれこれ20年前なわけで、当時のパソコンというとハードウェアはCPU が Pentium 133MHz メモリ16M とかそんな感じだったかなあ。今どきの携帯電話の例としてiPhone 6sを挙げるとCPUが1.85GHz メモリ 2G ってんだから凄いですね。OSは1995年11月23日リリースされたWindows95とかそんな時代背景です。インターネットがようやく一般に普及し始めたところでしょうか。

今から思うと相当弱いハードウェアですけども、そろそろVM方式を採用しても良さそうな、そんな時代でした。インタープリタだと流石に遅い、でもC言語のようなコンパイル言語だと"Write once, run anywhere"とはいかない、という判断もあったのだろうと思います。Javaが純粋なオブジェクト指向言語ではなくintなどのプリミティブ型を持つというのは、当時のマシンスペックを考えた場合、ある程度妥当な判断だったと言えるでしょう。これが後々苦しくなってくるわけなのですが。

Javaを作った会社はSun Microsystems(サン・マイクロシステムズ)というアメリカの会社で、2010年1月27日オラクルにより吸収合併され今はありません。SolarisというOSとSPARCプロセッサでUNIXサーバーの販売で90年代後半までは一人勝ちのような状況だったと聞きます。当時にすでに「ネットワークこそがコンピュータ」(The Network is the Computer)というモットーを掲げてたんだからおかしい。1996年リリースのJavaが標準でネットワーク機能を備えていたのもこのあたりの思想から来ているのかもしれませんね。

当時のプログラミング言語としてC++が挙げられますが、C++でのプログラマへの負担といいますか、ヒューマンエラーの起きやすさといいますか、その辺を改善する目的で開発されたのがJavaだったわけです。

1996年の時点にこんな言語が登場したのですから革新的でした。

いろんな企業がJavaに賛同します。その中にはMicrosoftもありました。この時期、Microsoftは次期のWindows開発用のプラットフォームにJavaを据えようと考えていました。その後、袂を分かつことになるのですが……。

プログラム言語として構文などを見ると、C++を強く意識した構文なのは間違いなく、しかしポインタ演算を廃してポインタを機能を限定した「参照」に置き換えるなど簡素化が多く見られます。C++からはいろんな機能が削られています。関数ポインタ、構造体、演算子オーバーロードテンプレート((テンプレートについては実装が間に合わなかったという話を聞きます))などなど。そのためC++の劣化であるように揶揄する人もいますが、こうしたものを捨てて言語仕様を比較的小さくシンプルに抑えた点は評価に値すると思います。しかし、今でもこうした削減された機能を愛する人からはJavaを腐す要素として挙げられてしまうのでした。

Java 1.1 1997年2月19日

Wikipediaからピックアップすると1.1での大きな機能追加は

といったところです。当初よりJavaの内部文字コードUnicodeで文字を表すchar型は16bitで設計されていました。Unicodeは当時それほど普及しておらず、Unicode対応のテキストエディタさえ少なかったと記憶しています。時代を先取りしていると言えますが、大きな誤算はUnicodeが当初16bitのコードポイントに世界のあらゆる文字を格納しようとしていたことで、漢字圏の我々からすると16bit=65,536程度の空間に文字が全部入るわけないだろ!というものだったが故に早々に破綻し、Unicodeは21bitのコードポイントに拡張されることになるのです。これはまた後の話。

なんにせよ、日本語が対応されたのは1.1からで、日本でのJavaの採用が始まったのはこの頃からと言えましょう。

当時のJavaのGUIはAWTというものでしたが、これを用いたGUIの開発は当時は結構行われていたイメージですね。Visual BASIC でGUIを作るプロダクトも結構あったと思います。GUIのためのオブジェクト指向言語としてJavaが使われていたイメージがありますね。JavaBeansもそのための仕様でした。件のsetter/getterの話題に繋がっていくのですが。

JDBCはJavaとデータベースをつなぐインターフェースです。RMIではあるJava VMから別のJava VMにオブジェクトを送って実行する、といったことができます。こうした機能が用意されたことで、ソフトウェアフロントとしてのGUI、裏方の実装のためのネットワーク機能、データベース機能、さらにはソフトウェアを配布するためのJava Appletという布陣でJavaでのソフトウェア開発が加速していた時代といえます。

Microsoft Visual J++ もこの時代ですよ。

Java 1.1以降のバージョンのものは互換性確認のためにOracle Java Archiveからダウンロードすることができ、今でも入手することができます。もちろん、Java7ですら2015年4月にEOL(End of Life,サポート終了)となっているので、通常利用するのはJava8としてください(本稿執筆時点)。

当時のドキュメントを見るのも一興です。現在と比べると標準APIがかなり小さい。なお、当時のjavadocは今とはデザインが大きく異なります。

  • java.applet
  • java.awt
  • java.awt.datatransfer
  • java.awt.event
  • java.awt.image
  • java.beans
  • java.io
  • java.lang
  • java.lang.reflect
  • java.math
  • java.net
  • java.rmi
  • java.rmi.dgc
  • java.rmi.registry
  • java.rmi.server
  • java.security
  • java.security.acl
  • java.security.interfaces
  • java.sql
  • java.text
  • java.util
  • java.util.zip

この時代であれば、全パッケージを舐めて標準APIを学ぶこともそう難しくはありませんでした。この時代から触っている人間は新バージョンが出るたびに増えるAPIを順に学んでいけたのです。しかし、現代にJavaを学ぶ場合、どのバージョンでは何があって……というのをいちいち学ぶ必要はほぼありません。Java5以前は一緒くたでいいと思いますし、一部のAPIで歴史的経緯があってねーというのを知っていればおそらく十分ではないでしょうか。

Java 1.2 1998年12月8日

strictfpキーワード浮動小数点演算をやる人は覚えておきましょう。JavaはパフォーマンスのためにCPUの浮動小数点演算を扱うことが許されており、そのため実行するCPUによって精度が異なることがあるんですね。まあ今時のCPUだと大丈夫だとは思うんですが。

リフレクション機能ではJavaのクラスを抽象的に扱うことができます。設定ファイルに書かれたクラス名のclassロードして実行する……みたいなことができるんですね。フレームワーク的なものを作る場合には多用することになります。

1.2からは新しいGUIのSwingが採用されました。AWTがOSごとのGUIパーツを用いていたためデザインに違いがあったのに対し、Swingでは統一的なルック・アンド・フィールが用いられるようになりました。まぁ今ならJavaFXを使うのが良いと思います。

初期のJavaはやはりVM方式の実行速度の遅さが指摘されていました。実行時の構文解析を伴わないだけインタープリタよりは早いものの、実行バイナリを作るC/C++よりは遅い、そうした評価です。ここではサン・マイクロシステムズのVMにJIT(ジャストインタイムコンパイラ)が乗ったことが挙げられていますが、JIT自体は別の会社が先駆けて開発していたことは記しておきたいと思います。

JITコンパイラは実行時にJavaのバイトコードを環境のネイティブコードコンパイルして動かす技術です。この後、JITコンパイラ、動的再コンパイル技術、世代別ガベージコレクションを備えたHotspotといった様にJavaVMは進化していきます。現代では実行時の最適化が進み、大きなスケールで見た場合、Javaの実行速度はC/C++での実装と比べてそれほど遅れるものではありません。遅くても倍の時間は掛からない程度といったところでしょうか。

あとは特記すべきはコレクションフレームワークです。皆が多用しているであろうjava.util.Listやjava.util.Mapといったライブラリが整備されたのがこの時なのです。それ以前はjava.util.Vectorやjava.util.Hachtableというクラスが可変長配列の機能を一手に担っていました。今ではVectorやHashtableは使うべきではありません。

Microsoft 離反

Java の開発はSun Microsystems が主導していたけども、すべてがSunのものだったというわけでもなく。Javaには多くの会社が出資していてその中のひとつMicrosoftだったわけですね。

Microsoft の Visual J++ では delegate とか独自機能拡張もありましたけど、裁判で問題になったのは J++ でコンパイルしたclassファイルMicrosoftのVMでしか動かないという部分ですね(他社製のVMで動くclassファイルを作ることもできる)。classファイルがどこのVMでも動くの大事だろ、"Write once, run anywhere"だろ、お前何してくれてんの!と喧嘩になったわけです。当時のMicrosoftブラウザまわりでも独自拡張がやりたい放題、標準規格?なにそれ美味しいの?みたいなスタンスをあちこちで見せていたものです。

結局、この事件でMicrosoftのJavaはバージョン1.1相当でストップ。好き勝手にやれないなら独自に言語作るわーとばかりに.NET フレームワークと C# といった方向に舵を取ります。

JavaがPC上でのUI開発の主力になろうとした勢いはここで潰えます。

Java EE

Java SE とは別にこの時代に Java EEリリースされていることは特記しておきたいですね。これ以後、それまでのCGIに取って代わって、JavaはWebサービスの開発のプラットフォームとして多用されるようになります。

2000年あたりからはJavaはGUI開発というよりは、Webサービスの開発が主流という流れになっていきます。インターネットサービスが非常に発達していった時代、背後ではとてつもない量のJavaのプログラムが支えていたわけです。ただまあ、こうした産業利用は一般的ユーザーの目にはあまり入らないわけです。一般人からすればJavaといえばJava Appletみたいなイメージはずっと残っていたでしょうが、実体としてはJavaといえばServletという時代になっていたわけです。

企業で用いられる社内システムにもServletは多く採用されました。

理由はいろいろ挙げれると思うのですが

というのが大きな理由だろうと思います。JSPというテンプレートエンジンを用いてHTMLを整形してWebページを作り出す、というアーキテクチャある意味では便利で簡単でした。

もっともHTMLの表現力に足を引きずられるため、GUIの機能性という点では後退したわけなのですが。それでもメリットが大きいと判断されたのでしょう。というか、まともにGUIを組めるプログラマがほとんどいないから、GUIのシステム開発がなかなか成功しないってのもあったんでしょうけどね。

iアプリ Javaアプリ EZアプリ

2000年あたりというと携帯電話の普及も取り上げなければなりません。現代のスマホガラケーに比べれば非常に機能は貧弱で、まさに携帯「電話」でした。要するに電話とメールぐらいしかできなかったんですね。

そこにdocomoiアプリJフォン(ボーダフォンを経て現ソフトバンク)のJavaアプリ、auのEZアプリという携帯電話上でちょっとしたアプリが動くよ!というのが乗るようになってきたんです。これがJavaを組込み用途にコンパクトにしたJava MEというものが土台となっていて(正確にはiアプリちょっと違う)Servletと並ぶJava言語の大きなもうひとつの領域となっていました。

iアプリは当初は容量が10k byteまでといった制約があり、容量制限が非常に厳しかったのですが、新機種が出るたびに容量は緩和されていきました。

docomoiアプリ含めiモードによって一世を風靡します。こうした土台を作ると、その上で商売をしたい人がたくさんやってきて、勝手にコンテンツを作ってくれる。docomoはそれらから手数料を取るので労せずして大金を稼げるというわけです。賭場の胴元というわけです。

この賭場が、将来にAppleiPhone, GoogleAndroidに荒らされることになります。docomoがなかなかiPhoneを出さなかったのもiモードという自前の賭場を失うことを良しとしなかったためです。金づるを失ったdocomoSamsungと組んで独自の携帯向けOSであるTizenの開発に乗り出します。そんなTizenですが鳴かず飛ばず。噂ではインドあたりではリリースされたとか、なんとか。

RIA時代

話を2001年に戻しましょう。

Microsoft離反でGUIのプラットフォームとしてのJavaというものは存在感を弱めていました。この分野の復権に寄与したのはJava 1.4 (2002年2月6日)で導入されたJava Web Startです。

Java Appletブラウザ埋め込みで動作したのに対し、Java Web Startではブラウザから起動しつつも独立したアプリとして起動するのです。

Webシステムが企業の社内システムに採用された話は先に述べたとおりですが、やはりWebシステムのGUIというのはHTMLに引きずられて貧弱だったんですね。

端的に言えば入力値が数字かどうか?みたいなチェックがなかなか難しい。HTML上でJavaScriptでやるわけなんですが、なかなか気持よく入力できるような感じにはならなかったんですね。

また、Ajaxによるブラウザのページ遷移を伴わない通信というのが出てきたのも2005年ぐらいなので、入力値に対してサーバ問い合わせするようなことはできなかった。当時だと一旦画面遷移させないとできなかったわけです。

こうした事情から、クライアントサイド、要するにPC側でもっとリッチなUIが使いたい!という要望があったわけです。Webシステム使いにくい!という不満の噴出と言ってもいい。そこで出てきたのがRIA (Rich Internet Applications)というわけです。

Javaは1.0時代のAppletからそうですが、ネットワークを介して別のPCにプログラムを送り込み、そこで動作させるという能力を持っていました。それこそまさにRIAに求められる機能性だったわけですね。

RIAの代表とされるのは

あたりです。三つ巴の戦い、どこに軍配が上がるのか!?と注目されましたが、勝利したのはHTML / JavaScriptでした。

Google MAP で注目を浴びたAjax技術、それまでブラウザでは不可能と思われていた高級なGUIをHTML / JavaScriptで実現させました。もうやめて欲しいですよね。せっかく脱ブラウザの流れが来たと思ったのにまたWebシステムに逆戻りですよ。

RIAが失速した理由として考慮して置かなければいけないのはスマートフォンの台頭です。RIAでは端末を選ばずどこでも同じアプリが動かせる点がポイントひとつでしたが、スマートフォンではそうは行かない。"Write once, run anywhere"を破壊したのはスマートフォンだったというわけです。

しかし、先日インストールなしでアプリを実行するAndroid Instant Appsが発表されたりしまして、結局RIAの思想といいますか、要求というのは今でも息づいているのだなと思った次第です。

Java 5 (2004年9月30日)

1.3 / 1.4 では機能追加はあっても言語構文が大きく変わることはありませんでした。大きく変わったのはJava 5です。この時からバージョニングが変わって1.5ではなく5と表記されるようになりました。

Java5の特徴はなんといってもジェネリクス。それまでjava.util.Listにデータを出し入れするのにはキャストが必須だったわけですが、ようやくキャストから開放され型の安全度がぐっと高まりました。その他に以下のような変更があります。

言語としては随分変わっったわけですが、もうかれこれ10年以上前のことですからこれらの機能が「Java5から導入された」という知識は今となってはあまり必要とされません。これらの機能が使えないJava 1.4で開発をする事案が殆ど無いからです。0ではないのが悲しいところではありますが。

その後

Java 6 (2006年12月11日)がリリースされた後、Java 7 (2011年7月28日) が出るまでJavaは停滞してしまいます。その間にSun Microsystemsという会社がなくなってしまったためです。

Sun Microsystems の経営状況が悪化しており、ついに身売りをすることになりました。身売り先はIBMともGoogleとも噂されましたが結局2010年1月27日オラクル吸収合併されました。

Javaの停滞中にはJava VM上で動く非Java言語も台頭してきました。Scalaなどですね。

やや戻って2007年Androidが発表されます。Androidの開発言語にはJavaが採用されていますが、実行環境はJava VMではなく、ライセンス的な事情でJava(TM)は名乗らない微妙な位置関係にあります。

Java 5 以降で大きく言語仕様に手が入るのは Java 8 (2014年3月18日)です。並列処理を行うためのStream APIと、そのために簡易に関数を定義するためのラムダ式が導入された点が大きいですね。日付APIも刷新されました。

このように、Javaは1.1の黄金時代から今に至るまで利用ジャンルを転戦しながら産業の土台となって支えてきた歴史があります。ジャンルの趨勢により浮き沈みもあります。今後についても決して楽観視はできないでしょう。Javaを学ぶことはプログラミングを学ぶステップとしては意義はあると思いますが、Javaを学べばゴールというわけではありません。プログラム言語次世代へと移りつつあります。業界動向には注視していきましょう。

2016-03-24

http://anond.hatelabo.jp/20160324095716

Java関係があるScalaってのはPlayFrameworkなんかの特定フレームワークの話

わかってる人が書いた文章とは思えない。

Scalaフレームワーク関係なく、バイトコードコンパイルされてJVM上で動くでしょ?

っていうかPHPシェルスクリプト大好きないつもの老害おじさんでしょ?

2015-11-12

参考訳:拡散したJavaシリアル化の脆弱性についてApache Commons声明

原文:https://blogs.apache.org/foundation/entry/apache_commons_statement_to_widespread

原題Apache Commons statement to widespread Java object de-serialisation vulnerability

翻訳日:2015年11月12日(午後にタイトル日本語しました)

----

2015年11月1日 火曜日

Apache CommonsJavaオブジェクトのデシリアライゼーション脆弱性に関するステートメント

著者:Bernd Eckenfels(コミッター), Gary Gregory(Apache Commons副責任者)

AppSecCali2015 でGabriel Lawrence (@gebl) と Chris Frohoff (@frohoff) によって発表された "Marshalling Pickles - how deserializing objects will ruin your day" は、信頼されないソースからシリアル化されたオブジェクトを受け取るときセキュリティ問題をいくつか明らかにしました。主な発見は、Java オブジェクトシリアライゼーション(訳注:seriarization/シリアル化/直列化=ネットワークで送受信できるようにメモリ上のオブジェクトデータバイト列で吐き出すこと。シリアル化されたJava オブジェクトRMIなどのリモート通信プロトコル使用される。)を使用する際に任意Java関数の実行や操作されたバイトコードの挿入さえもを行う方法説明です。

Frohoff氏のツールである ysoserial を使って、Foxglove Security社のStephen Breen (@breenmachine) 氏はWebSphereJBossJenkinsWebLogic、OpenNMSといった様々な製品調査し、(http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/) に各々の様々な攻撃シナリオ記述しています

両者の調査活動は、開発者Javaオブジェクトシリアライゼーションに信頼を置きすぎていることを示しています認証前のシリアル化されていないオブジェクトにも。

Javaにおけるオブジェクトのデシリアライゼーション(訳注:de-serialization/非直列化=ソフトウェアで扱うことができるように、送受信されたデータを元に戻すこと)が行われるとき、大抵は想定された型にキャストされ、それによって、Javaの厳しい型のシステムが、得られた有効オブジェクトツリーだけを保証しています

不幸にも、型のチェックが起こるまでの間に既にプラットホームコードが生成されて、重要ロジックは実行されてしまっています。そのため、最終的な型がチェックされる前に、開発者コントロールを離れた多くのコードが様々なオブジェクトの readObject() メソッドを通じて実行されてしまます脆弱性のあるアプリケーションクラスパスから得られるクラスの readObject() メソッドを組み合わせることで、攻撃者は(ローカルOSコマンドを実行するRuntime.exec()の呼び出しを含めて)機能を実行することができます

これに対する最も良い防御は、信頼されていないピア通信相手)とは複雑なシリアルプロトコルを使うことを避けることです。ホワイトリストアプローチ http://www.ibm.com/developerworks/library/se-lookahead/実装するように resolveClass をオーバーライドするカスタム版の ObjectInputStream を使うと、影響を制限することができますしかしながら、これは常にできることではなく、フレームワークアプリケーションサーバがエンドポイント提供しているような時にはできません。簡単な修正方法がなく、アプリケーションクライアントサーバプロトコルアーキテクチャを再検討する必要があるため、これはかなり悪いニュースです。

これらのかなり不幸な状況において、エクスプロイトのサンプルが見つかっています。Frohoff氏は、 Groovy ランタイムSpringフレームワークApache Commons コレクションからクラスを組み合わせるサンプルのペイロードに gadget chains (ガジェット・チェーン)を見つけています(訳注:provided)。これはこの脆弱性エクスプロイトのためにより多くのクラスを組み合わせられることは完全に確実なことで、しかし、これらは今日攻撃者が簡単に得られるチェーンです。

(Twitter画像)https://blogs.apache.org/foundation/mediaresource/ce15e57e-94a4-4d7b-914c-8eb8f026659c

この脆弱性のために利用される(訳注:blamed)ことができない確かな機能実装するクラスができ、安全性が信用できないコンテキストにおけるシリアル化を利用されないようにするような既知のケースの修正ができたとしても、少なくとも分かったケースだけでも継続的修正していくことが要求されますモグラ叩きゲームを始めるだけであるかも知れませんが。実際にはこれは、オリジナルチームが Apache Commons チームに警告が必要だと考えていない理由で、それゆえに比較的、活動開始が遅れました。

Apache Commons チームは InvokerTransformer クラスのでデシリアライゼーションを無効化することによって commons-collection の 3.2 と 4.0 のブランチにおける問題対処するために、チケット COLLECTION-580(http://svn.apache.org/viewvc/commons/proper/collections/branches/COLLECTIONS_3_2_X/src/java/org/apache/commons/collections/functors/InvokerTransformer.java?r1=1713136&r2=1713307&pathrev=1713307&diff_format=h) を使っています議論されているやるべきことのアイテムは、変化させる仕組み毎(per-transformer basis)に、プログラマティックに有効にするような機能提供するかどうかです。

これには前例がありますOracle と OpenJDK JRE の一部であったり、バイトコードを挿入して実行することを許したりする com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl クラスで、セキュリティマネージャー定義されているとデシリアライゼーションを拒否します。

これはシステムプロパティ jdk.xml.enableTemplatesImplDeserialization=true とすることで無効にできますApache Commons Collection は、本来よりもこの実行モデルは一般化していないため、セキュリティマネージャー存在独立したこの機能無効化することを計画しています

しかしながら、明確化のために述べておくと、この便利な"ガジェット"は、唯一知られている方法でもなければ、特に未知のものでもありません。そのため、インストールされたものを強化されたバージョンApache Commons Collection に置き換えることが、アプリケーションをこの脆弱性に対抗できるようにするわけではありません。

このブログポストレビューのために Gabriel Lawrence に感謝したいと思います

Apache Commons Collection は、Java コレクションフレームワークに加えて追加のコレクションクラス提供する Java ライブラリです。InvokerTransformerコレクションにあるオブジェクトを(特にリフレクション呼び出しを通じてメソッドを呼び出すことで)変換するために使うことができる Transformer ファンクションインターフェース実装の一つです。

一般のSallyによる2015年11月10日午前10字15分にポスト | コメント[1]

コメント

OracleWeblogicセキュリティアラートを発行しています

http://www.oracle.com/technetwork/topics/security/alert-cve-2015-4852-2763333.html?evite=WWSU12091612MPP001

提供されている回避策は、T3プロトコルへのアクセス(とリバースプロキシーにおけるT3メソッドフィルタリング)です。

2012-10-24

http://anond.hatelabo.jp/20121024113536

■頭の中でCを簡単なアセンブラに変換できるのが大事

http://anond.hatelabo.jp/20121024004748

こんにちはこんにちは

以前、"he doesn't use struct or union?"と書いて、ここの住民に糞味噌に言われた人です。

#が、この一言で何が言いたいかからなければ、プログラマーとしては最低ランクだと思うよ。

俺の場合は、

1. C勉強開始

2. PC-9801スプライト動かした段階で息が絶える...orz

3. 放置

4. C++勉強開始

5. OOよくわからんC++むずい...orz

6. アセンブラとかZ80、8086、386、486の勉強開始

7. すげぇよくわかった!CASLとかも試験のためにやった

8. Javaアルファー版をダイアルアップでダウソ

7. 英語マニュアルしかないので仕方なく読む

8. OOの何がいいのか理解できたヽ( ゚∀゚)/

9. Javaで書いたソフト雑誌で紹介されたり、賞を取ったりした

10. JVMとかクラスファイルフォーマット勉強開始

11. C、C++勉強OpenGLゲームとか作る

12. 振り返ってみると、全ての知識が有機的に結合されている!!!頭の中でCを簡単なアセンブラに(Java場合バイトコードに)変換できるのが大事だったんだね!!!

13. 就職

14. 転職

15. 就職

16. 転職

17. 病欠

18. 転職

19. 離職

20. 無職

現場ゴミみたいなコードを書く人とかゴミみたいな設計をする人で精神を痛められます

ITは辞めた方がいいよ。

#これも後で消す。

#あと、文章を消すのは鼻から議論する気がないかdeath。これはチラシの裏

2010-01-23

gcclink time optimization

gcc-4.5 から link time optimization (lto) と呼ばれる最適化が可能になった。

従来の分割コンパイルでは、コンパイル単位(ファイル)での最適化しかできなかった。例えば、別ファイル関数をインライン展開することはできないし、引数に渡されたポインタの escape analysis も諦めざるを得なかった。

lto はコンパイルする時に、中間表現(GIMPLEのバイトコード表現)をオブジェクトファイルに残しておき、リンクするときに、すべての中間表現を使って最適化しなおす。要は、ソースコードを全部とっておいて、最後に全部をコンパイルしなおすのと、同じようなものだ。

最大の欠点は、最後にコンパイルしなおすところだ。
このコンパイルは一回のコンパイルであり、単一プロセスで実装されているのでマルチCPUを生かせない。(いっぽう、分割コンパイルなら依存関係が緩いので並列化しやすい。)また、プログラム全体は巨大であり、最適化するのに時間がかかる。

使いかたは簡単だ。-fltoを付ければいい。

gcc-4.5 -c -O2 -flto foo.c

gcc-4.5 -c -O2 -flto bar.c

gcc-4.5 -o myprog -flto -O2 foo.o bar.o

2008-12-31

anond:20081230040914

あんま関係ないけど、

どうやって作るか?より、

何を作りたいか?から始めた方がいいんじゃないのかな

PICとかの組み込みが楽しそう!とかなれば、

やっぱりC覚えたほうが何かとらくちんだと思うし。

Webやりたい!だったらJavaScriptとかPHPあたりだろうし、

であれば、人によってはVBAから始める人もいるだろうなぁ。

ちなみにイマドキの授業とかでJavaやる場合、JavaVM(バイトコードだし)とかも対象範囲に入ったりするのかね。よくわからんけどさ。

2008-12-17

アセンブラ

アセンブリ言語ってメモリレジスタ間でひたすら読み書きするだけなので全然難しいことないと思うんだけどな。自分で書くぶんには。確かに面倒臭いし可読性は低いかもしれないけど。C言語ウルトラスーパーデラックスマクロアセンブラなのでちょうどいい感じ。

むしろ高級言語でいろんな人が各人の美学に基づいて設計したオレオレ概念を理解するほうが骨が折れる。アセンブラ脳に染まってると、ローレベルで何をどうしたらいいかは想像できてても、その言語ルール上でどう記述したらいいかが分からなかったりする。

JavaはややっこしいけどJavaバイトコードは素直なスタックマシンでわかりやすいよね、とか思ったりもする。

2007-07-07

史観でものを言っている。

http://anond.hatelabo.jp/20070707200510

かつて実際にそういうような流れがあった。それはe-mailの世界。本文はまだしもヘッダに2バイトコードを入れるのはマナー違反だ、とされており、それを鵜呑みにした日本人まで日本語のSubjectを鬱陶しがった。実際問題として、本文はMIME変換されているからいいようなものの、ネット上を通過してくる間に1箇所でも7バイトコード環境が介在すればヘッダは文字化けしたから、マナーというか制御不可能な危険を避けるならSubjectに日本語を使用するべきではなかった。

現状は見ての通り。

よって、2バイトコード環境も多言語サポート環境ネットの帯域も、悉くなんとかなってしまっている今、歴史が繰り返すことはない。

因みに太平洋戦争時に日本方言が超難解な暗号として使用された実績があることはあまりに有名だが、本題とはあまり関係がない。

2007-06-22

http://anond.hatelabo.jp/20070621222911

>「勉強会って誰がやりたがってるんですか?? こんなことやっても使わないし会社的には損失ですって。」

>「そもそもプログラムなんて入ったばっかの新人のやることですよね?? 早く新人とって企画やらせてくださいよー」

増田氏の会社にもよるだろうけど、コーディングが出来ない人はまともな設計が出来ないし、まともな設計が出来ない人はまともな企画ができないとおもう。

アイデアだけ出してと丸投げすることが出来る環境があるなら別だけど。

>そんなわけで、ほんとのプログラマーが手に入ったら彼らは解雇するつもりです。ほんとのプログラマーを募集します。仕事サボってバイトコードエンジニアリングにはまっちゃうような荒くれた人、大歓迎です。

そういうの大好きだけど、無職だけどヒキコモリだから仕事ができない。

 
ログイン ユーザー登録
ようこそ ゲスト さん