[Java, Security] Closing the closed APIs

原文はこちら。
https://blogs.oracle.com/java-platform-group/entry/closing_the_closed_apis

今年初め、WIREDが次のような記事を発表しました。
Oracle Makes Java More Relevant Than Ever — For Free
http://www.wired.com/wiredenterprise/2013/09/oracle_java/
“Oracle has actually opened up Java even more — getting rid of some of the closed-door machinations that used to be part of the Java standards-making process.”
(Javaの標準策定プロセスの中で使われた非公開の企みを取り除いたという点で、Oracleは実際にJavaをより一層開かれたものにした。)
このオープン性はOpenJDKやJava Community Processから伝わってきます。様々な企業や開発者が協調してJavaプラットフォームの将来をガイドしようとしているのです。
Javaのオープン化の中には、実際のJava言語仕様およびAPIの蚊帳の外にある、JDKの内部APIの進化に対処することが含まれています。
Java SE Technical Documentation
http://docs.oracle.com/javase/index.html
Java™ Platform, Standard Edition 7 API Specification
(英語)http://docs.oracle.com/javase/7/docs/api/
(日本語)http://docs.oracle.com/javase/jp/7/api/
開発者はsun.*パッケージのような内部パッケージを使うべきではありませんが、Javaの18年もの歴史にわたり、様々なアプリケーションがこうしたAPIを様々な理由で使ってきました。
FAQ - Sun Packages : Why Developers Should Not Write Programs That Call 'sun' Packages
http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html
これらの実装固有の内部APIが変わると、課題が浮かび上がり、様々なJava実装間でのアプリケーションの移植性を減少させる可能性があります。コンポーネントライブラリを簡単に入手できることを考慮すれば、内部APIの利用を識別してその利用を軽減し、公開APIを利用するようにする必要があり、その方法を模索しています。
What's Happening in the Land of Open Source Components (Sonatype Blog)
http://blog.sonatype.com/people/2013/11/open-source-components/
このエントリでは、これらの内部APIの取り扱いに関するトピックをとり上げます。
  • 内部APIの識別方法
  • 現在のターゲット:CORBAおよびApplets/SecurityManager
  • JDepsの詳細

Approach in identifying internal APIs

internal API(内部API)の定義は、Java実装が提供するパッケージもしくはクラスのうち、公開されたAPIセットにないものです。JDK8に向け準備を進めていますが、OpenJDKにはjdepsという新しいツールが含まれています。これはアプリケーションのJARファイルやバイトコード内で利用されている内部APIを発見できるものです。
jdeps
http://download.java.net/jdk8/docs/technotes/tools/windows/jdeps.html
このツールを実行すると、どのコンポーネントで内部APIを使っているか、どの内部APIを使っているか、がわかります。
jdepsを数多くのアプリケーションで実行し、内部APIの人気を把握し、影響を把握しようとしてきました。

CORBA and Applets/SecurityManager

Java 7 Update 51 (2014年1月)から、内部のドキュメント化されていないcom.sun.corba.seパッケージのAPIを制限APIリスト(restricted API list)に移動する予定です。これにより、以下の3条件すべてに適合するアプリケーションに影響があります。
  1. アプリケーションが制限されたパーミッションを利用している(つまりサンドボックス化されたRIAもしくは、SecurityManagerと共に使う場合)
  2. CORBAを使っている
  3. ドキュメント化されていない内部Sun API(com.sun.corba.se.*)を使っている
内部API(com.sun.corba.se.*)を制限APIリストに移動させるという最初の試みは、今年の6月のOpenJDKメーリングリストにさかのぼります。
RFR: 8000450: Restrict access to com/sun/corba/se/impl package
http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/017673.html
何度かのレビューを経て、10月によりよいパッチができました。
8021257: com.sun.corba.se.** should be on restricted package list
http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-October/022403.html
Java 7 update 51から、内部CORBA APIは制限APIリストに入ります。これはこの内部APIを使っているRIAがある場合、アプリケーションのmanifestに"Permissions: all-permissions"というエントリを追加しなければならず、しかもサンドボックスを使えないということを意味します。アプリケーションがSecurityManagerを使ってきめ細かいパーミッションを指定しているならば、SecurityManagerで"accessClassInPackage.com.sun.corba.se"パーミッションを指定する必要があります。

The Security Manager (The Java Tutorials)
http://docs.oracle.com/javase/tutorial/essential/environment/security.html
  • コードやコンポーネントがこれらの内部CORBA APIを使っているかどうかを確認するためには、jdepsを使い、"com.sun.corba.se"という出力があるかどうか探します。
  • jdepsからの出力にドキュメント化されていない内部APIが利用されている旨の記載がある場合、次の2個の選択肢をとることができます。
    1. (推奨)ドキュメント化されていない内部APIの代わりに、javax.rmi.CORBAもしくはorg.omg.* APIを使うようにコードを書き換える。
      javax.rmi.CORBA
      http://docs.oracle.com/javase/7/docs/api/javax/rmi/CORBA/package-summary.html
      org.omg.*
      http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html
    2. "Permissions: all-permissions"というmanifestエントリをAppletで利用したり、SecurityManagerから、"accessClassInPackage.com.sun.corba.se"パーミッションを入手することで時間を稼ぐ。是非時間をとって、上記オプションAを選択するようにしてください。

JDeps in detail

OpenJDK 8ではjdepsというユーティリティを導入し、JARファイルをチェックし、内部APIを使っているJARファイルを識別し、見つかったAPIをリスト化しています。このツールは、「これらの内部クラスを使用していますか?」とか「もしそうなら、どれを使っていますか?」といったと質問に答えてくれます。jdepsを使用し、アプリケーションを確認するには、JDK8のプレビューリリースをダウンロードすればいいのです。JDK8上で実際にテストしたりアプリケーションを実行する必要はありません。JDK8なのは、たまたまjdepsユーティリティがある場所ということにすぎません。
JDK™ 8 Early Access Releases
https://jdk8.java.net/download.html
ソースコードがなくてもjdepsをアプリケーションに対して実行できます。jdepsをアプリケーションに掛けるコマンドは以下のような感じです。
jdk8/bin/jdeps -P -jdkinternals *.jar > your-application.jdeps.txt
your-application.jdeps.txtには以下のように出力されます。
your.package (Filename.jar)
      -> com.sun.corba.se            JDK internal API (rt.jar)

0 件のコメント:

コメントを投稿