4

Java のセキュリティ問題が発生しています。pdfbox-1.7.1.jar を使用してパスワードを知っている PDF を復号化するエージェントがあります。jar は、サーバーとクライアントの両方で /jvm/lib/ext に配置されており、スタック トレースのこの小さな美しさが得られます。

java.lang.SecurityException
at java.lang.SecurityManager.checkPermission(SecurityManager.java:582)
at COM.ibm.JEmpower.applet.AppletSecurity.checkSecurityPermission(AppletSecurity.java:1332)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1613)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1464)
at java.lang.SecurityManager.checkSecurityAccess(SecurityManager.java:1725)
at java.security.Security.insertProviderAt(Security.java:190)
at java.security.Security.addProvider(Security.java:210)
at org.apache.pdfbox.pdmodel.encryption.SecurityHandlersManager.getInstance(SecurityHandlersManager.java:146)
at org.apache.pdfbox.pdmodel.PDDocument.openProtection(PDDocument.java:1365)
at org.apache.pdfbox.pdmodel.PDDocument.decrypt(PDDocument.java:798)
at com.magerman.hremail.prep1docc.PDFDecryptor.decrypt(Unknown Source)
at com.magerman.hremail.prep1docc.MetaAttachment.decrypt(Unknown Source)
at com.magerman.hremail.prep1docc.MetaDocContainingAttachments.removePasswordOfPDFAttachments(Unknown Source)
at com.magerman.hremail.prep1docc.EPDFPreparerFactory.generateAttachmentsTriggerDocs(Unknown Source)
at com.magerman.hremail.prep1docc.EPDFPreparerFactory.run(Unknown Source)
at com.magerman.hremail.prep1docc.BaseClass.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)

クライアントとサーバーの両方が 8.5.3 を使用しています。エージェントのセキュリティ レベルは 3 に設定されています。jar をエージェント自体に配置しても効果はありません。エージェントの署名者は、サーバーの完全な管理者です。セキュリティ例外は「insertProviderAt」を指しているようです

これは私が試したものです:

パッティング

grant {
permission java.security.AllPermission;
}

私の問題は解決しますが、私はこれを目の肥えた管理者に渡すことは決してありません。

アクセス許可の範囲をデータベースだけに縮小しようとしていますが、ここのドキュメント: http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.htmlでは、実際にその方法を教えてくれませんでした。メモ データベースを入力します。

ここで、 Xpages Java セキュリティに関する Stephan Wissel の記事を調べました。

grant codeBase "xspnsf://server:0/development/hre-mail/hre-mail2_0/hre-mail_(2_0)_dev.nsf/-" { 
permission java.security.AllPermission;
};

私のcodeBase構文はnsfデータベースでは有効ではなく、Webページに対してのみ有効であるためだと思います。

私はまた、本当に必要なものに許可を減らし、ここのドキュメントを見ています: http://docs.oracle.com/javase/1.4.2/docs/guide/security/permissions.html

私は何かをしなければならないことを意味します

java.security.SecurityPermission "insertProvider.{name}"

しかし、{name} がどうあるべきかわかりません。

http://lekkimworld.com/2013/06/20/java_in_notes_domino_explained_on_java_security_and_how_it_relates_to_notes_domino.htmlで Mikkel の記事も読みました。

しかし、私の脳はページの真ん中あたりで揚げました。特に、このメソッドを実際に実装する方法がわかりません。私の手を握って通り抜けていただけますか?

私がそれに取り組んでいる間、/jvm/lib/ext に新しい jar を入れるときはいつでも、私がする必要があるのは

tell http restart

JVMをリロードさせるには?私は、Domino が Xpages、エージェント、および HTTP タスクに単一の JVM を使用していると想定していますが、これは正しいことです。

また、java.policy の新しいポリシーを有効にするには、サーバーを再起動する必要があるというのは正しいですか?

何か案は?

4

1 に答える 1

3

質問を見てくれた Richard、Simon、Mark Myers、および giulio に感謝します。

私は最終的に、Mikkel の記事を (非常にゆっくりと読んで) 理解できるようになりました。

http://lekkimworld.com/2013/06/20/java_in_notes_domino_explained_on_java_security_and_how_it_relates_to_notes_domino.html

解決策は思ったより簡単で、リフレクションの例に戸惑いました。

これは、java.policy ファイルを変更するよりも洗練された方法です (私は管理していませんでした)。

問題を起こしていたメソッドの狡猾なラッパーである新しいメソッド dopriviledgeddecrypt() を追加して、decrypt() メソッドを呼び出すときに問題を引き起こしていたクラスを修正しました。次に、すべての呼び出し元を PDFDecryptor.decrypt() に変更して、PDFDecryptor.dopriviledgeddecrypt() を呼び出すようにしました。最後のステップでは、クラス全体を jar ファイルにエクスポートします。このファイルは、(クライアントで) 開発しているマシンと、このコードが実行されるすべてのサーバーの両方の \jvm\lib\ext フォルダーに配置されます。

また、java.policy ファイルを変更して単一の Notes データベースのみに影響を与える構文があるかどうかもわかりませんでした。(更新:これは不可能であることがわかりました)

package com.magerman.hremail.prep1docc;

public class PDFDecryptor {

/**
 * Instantiates a new pDF decryptor.
 * 
 * @param inputFile
 *            the input file
 * @param inputPassword
 *            the input password
 */
public PDFDecryptor(final File inputFile, final String inputPassword) {
originalFile = inputFile;
password = inputPassword;
}

/**
 * Decrypt. Given an inputted PDF File, will try to remove the security of
 * the PDF and save in-place. Done after the attachments have been extracted
 */
public final void decrypt() {
// naughty code here
}


public final void doproviledgeddecrypt() throws Exception {
AccessController.doPrivileged(new PrivilegedExceptionAction() {
    public Object run() throws Exception {
    PDFDecryptor.this.decrypt();
    return null;
    }
});
}

}
于 2013-10-16T14:07:21.270 に答える