この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

Struts2

Struts2のリモートコード実行可能脆弱性(CVE-2017-5638)を分析した

またOGNL絡みの脆弱性が見つかりました。 アウトラインはid:Kango氏がまとめているこちらが参考になります。 http://d.hatena.ne.jp/Kango/20170307/1488907259 さて、この脆弱性の動作原理を調べてみました。 ファイルアップロード時のヘッダの処理方式に問…

struts-2.5.5でI18nInterceptorの初期化失敗を無理やり回避する

2017-07-13追記 struts-2.5.12で解消された模様です。 対応するJiraのチケット struts-2.5.5がリリースされました。 このリリースはかなり大きなインパクトのある変更がいくつか入っています。 最大のインパクトは、ActionContext#getParameters()の戻り値が…

struts-2.3.24へアップデートする際の注意点

Struts-2.3.24がリリースされています。リリースノートはこちら。 http://struts.apache.org/docs/version-notes-2324.html 以下、僕のコードベースでは対応が必要だった変更点を書いておきます。 スローされた例外を無視してしまう不具合をFIX http://issue…

Struts-2.3.15.3リリース

先日、Struts-2.3.15.2でエンバグしてしまった件を日記に書きましたが、 そのバグを改修したバージョンであるStruts-2.3.15.3がリリースされました。https://struts.apache.org/release/2.3.x/docs/version-notes-23153.html このバージョンでの修正点は以下…

struts-2.3.15.2リリース。しかしエンバグした模様

Struts-2.3.15.2がリリースされています。 しかし残念なことに、深刻なエンバグが入ってしまったようです。https://issues.apache.org/jira/browse/WW-4204 僕もこれにぶち当たりました。 Struts-2.3.15.2でFIXされた内容 Struts2には、特定のパラメータをリ…

struts-2.3.15.1緊急リリース

はいどうも。毎度のOGNL脆弱性FIXが出てますよ。 今回は2つ。 簡単に言うと、Struts2はパラメータ名に"action:"、"redirect:"、"redirectAction:"が付いたものを特別扱いする仕様なのですが、その扱い方に問題があったということです。 OGNLとして評価されて…

struts-2.3.14.3緊急リリース

最近、セキュリティFIXのリリースが多いですね。良いことであると捉えるべきか… EOLになったStruts1.xからの乗り換えにより、『目玉の数が増えた』というところでしょうか。 さて、今回のFIX対象も例によってOGNL絡みです。 http://struts.apache.org/releas…

struts-2.3.14.2緊急リリース

毎度おなじみのOGNL関連の脆弱性です。 つい数日前にリリースされたstruts-2.3.14.1で、デフォルトではOGNLの評価が無効化されました。 しかし今回の脆弱性はそれとは関係なく発生します。 以下のURLにある詳細によると、 http://struts.apache.org/release/…

struts-2.3.14.1はドロップインリプレース不可(の場合あり)

struts-2.3.14.1がリリースされています。 http://struts.apache.org/development/2.x/docs/version-notes-23141.html バージョンを見れば分かる通り、小さなメンテナンスリリースです(2.3.14→2.3.14.1)。 当然ドロップインリプレース出来るだろ常識的に考え…

Struts1.xがEOL

2014-04-23追記 昨今の状況を鑑みるに、新規案件でのStruts2の採用は余りお勧めできないと言わざるを得ません。 僕はStruts2およびOGNLのソースコードを実際に読み込んだ上で、自分で危険と判断したところは独自でパッチを当てているため、報告されているよ…

struts-2.3.12はドロップインリプレース不可

いつの間にsturts-2.3.12がリリースされてました。 いつものようにドロップインリプレースだと決めつけて、何も考えずにアプリを実行したら、エラーで動かない。 何じゃ? というわけで調べてみると、Struts2のカスタムタグの、基本属性の一つである"require…

struts-2.3.7がやたら重い原因が判明

2013-01-15追記 struts-2.3.8では解消済みのようです。 https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12311041&version=12323480 最近、Struts-2.3.7がリリースされたわけですが、何故だかアプリの動作がやたら重くなる。 jarを更新し…

useBodyEncodingForURIの挙動

昔はStruts2のStrutsPrepareAndExecuteFilterが文字化けするという問題がありましたが、 さっき試してみたら、 POST→化けない GET→化ける のようです。ただしGETについてはFilterDispatcherでも同じなので、 Struts2PrepareAndExecuteFilterのバグというわけ…

Struts2のデフォルトのBeanを置き換える

OGNL評価中に発生した例外を握りつぶさずに上位へスローするかどうかの制御は、struts.xmlにて <constant name="struts.el.throwExceptionOnFailure" value="true" /> を指定することで行います。 で、当然ながらすべてのOGNL例外を握りつぶさずスローするにようになります。 しかし、とある事情により、いくつかの例外は無視し</constant>…

Struts-2.3.1.2緊急リリース

以前のリリースで、OGNL式の解釈にまつわるセキュリティ問題が解消されましたが、 またOGNL式の解釈で致命的な問題が見つかりました。 というわけでStruts-2.3.1.2がリリースされています。 今回のリリースで解消された問題は次の通り。例によって手抜き翻訳…

struts.xmlで宣言した定数を参照する

生きてます。 最近は、技術的に全く面白みのない仕事をしていたためブログをサボリ気味でしたが、 来月から自社の作業に戻るため、ぼちぼち再開できると思います。たぶん。 さて。 struts.xmlで、以下のように定数を宣言することがあるわけですが、コレを参…

Struts-2.2.3.1リリース(緊急度高!!)

久しぶりにStruts-2.2系がアップデートされていました。 緊急性の高いセキュリティFIXを行ったようです。 何がFIXされた? POSTした値をアクションフォームにセットするとき、『文字列→値』の変換エラーになる場合は、 入力フォームにエラーの値を再表示して…

struts-2.2.3のxworkにハマった

これを書いている時点では公式ページの告知は無いが、struts-2.2.3がリリースされている。 Mavenリポジトリには既に最新版が配置済みのようで、Ivyで全ての依存関係を更新したらjarが落ちてきた。 しかしこのstruts-2.2.3、ちょっとクセがあるようで、Webア…

struts-2.2.1リリース

さりげなくstruts-2.2.1がリリースされてます。 とりあえず、struts-2.1.8.1からそのまま置き換えても、ちゃんと動くようです。 もういい加減、StrutsPrepareAndExecuteFilterの文字化け問題は修正されてるだろ流石に。と思ってソースを覗いたらstruts-2.1.8…

Javassistでpropertyタグにパッチをあてる

(2010-8-29追記) ココに記載しているコードは、最新版の2.2.1では適用できません。ご注意を。 ずいぶん前の日記で、struts-2.1.8にしてからタグの挙動が変わって困っているということを書きました。 ちょうど同じ現象で困っていた方からの質問を受け、 とり…

Interceptorにおける@PostConstructの動作がヘンでござるの巻

struts.xmlにおいては、ある程度はBeanの定義やDIを設定できます。 もちろんSpringと比較するとごく簡単な機能しか提供していませんが。 さて、とあるInterceptorを作成してstruts.xmlに登録し、そのInterceptorに対してパラメータを与えてみました。 <interceptor name="xyz" class="aa.bb.cc.XyzInterceptor"> <param name="foo">bar</param> </interceptor> …

Dynamic属性に必要なインタフェースを実装していません?

こんなエラーが出てました。 org.apache.jasper.JasperException: /WEB-INF/content/mother_auth/login/input.jsp(58,6) s:submit タグはそれがdynamic属性を受け付けると宣言していますが、それに必要なインタフェースを実装していません at org.apache.jas…

Struts2がBeanのプロパティ型を決定するロジック

私的メモ。 Struts2は、Beanへのプロパティ値セットを、OGNL経由で行っている。 そして、OGNLでBeanのプロパティをセットするとき、変換先の型を決定しているのは com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminerクラス。 なお、コレ…

struts2-convention-plugin状況下にてJSPへフォワードする

struts2-convention-pluginを使っているときに、 特定の例外が発生したらJSPへフォワードしようと思って、 <global-results> <result name="db-error" type="redirect">/errors/db-error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="foo.bar.DatabaseException" result="db-error"/> </exception-mapping></global-exception-mappings>

OGNLでeval関数の代用品を作った

OGNLにはeval関数がありません。 ですがどうしてもeval関数を使いたいシチュエーションが発生したので、作りました。 作ったとは言ってもeval関数そのものではなくて、代用品です。 暗黙ラムダ関数として定義してもよかったのですが、面倒だったので…(-_-) …

Struts-2.1.8に更新したら、マルチバイト文字が文字参照になった

2010-12-17 簡単なバグが含まれていたのでサンプルコードを修正しました。今更気がついたのですが… Struts-2.1.8に更新したら、マルチバイト文字が文字参照になってしまいました。こんな感じ。 Before <input type="submit" id="list" name="action:list" value="確認"/> After <input type="submit" id="list" name="action:list" value="&#25147;&#12427;"/> 大きな実害はないのですが、 HTMLのソースを見…

struts-2.1.8リリース

さりげなくStruts-2.1.8がリリースされていました。 変更点 Backward compatibility issues with prior development release The bean named-variable was renamed to namedVariable ww-3092 If the @Result annotation is marked at the method level, it w…

"Selecting From Collections"式とLambda式の怪

(2009/08/25修正: Enumだけの問題ではなく普通のBeanでも現象が発生したため、文言を若干修正しました) OGNLのSelecting From Collections式(以下、SFC式)は、コレクションから条件にマッチする要素だけを抽出する式です。 みんな大好き内部イテレータってヤ…

OGNL式の評価中に発生した例外が無視される件

いやー、1時間ほどハマりました。 JSP内で、Actionクラスのgetterでプロパティ値を取得し表示するという単純なコードで、 値がなぜか常にnullになるという現象に悩んでいたのですが。原因は、getter内でRuntimeExceptionが発生していたからでした。 OGNLの罠…

Struts2で継続(Continuation)

XWorkのActionSupportクラスのJavadocを見ていたら発見してしまったのです。 継続をサポートしているということを。 どのように実装しているか大変興味を持ったので、早速ソースを見てみると、 /** * * Stops the action invocation immediately (by throwi…

OGNL式で存在しないプロパティへアクセス

先程まで、OGNL式の謎の例外に悩まされていたのですが、 Caused by: java.lang.NullPointerException at com.opensymphony.xwork2.ognl.OgnlValueStack.checkForInvalidProperties(OgnlValueStack.java:298) at com.opensymphony.xwork2.ognl.OgnlValueStack…

struts-2.1.6とxwork-2.1.4

現行最新版のStruts2はstruts-2.1.6であり、それに対応するXWorkはxwork-2.1.2です。 でも、XWorkの最新版は2.1.4です。そこで、XWorkを入れ替えて最新にしてみました。すると… Caused by: java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/Te…

更新系ユースケースにおけるフィールド初期値の復元

確認画面付きの更新系のユースケースにおいては、入力画面を表示するときに最初に一度だけ初期値を復元する必要があります。このとき、入力フィールドに初期値を表示するために(#initialValueOfHogeはどこかから持ってきた値とする) <s:textfield name="hoge" value="#initialValueOfHoge" /> と書いてしまうとダメで</s:textfield>…

iteratorタグの落とし穴

Struts2のタグは、リストをforeachループでまわしてそれぞれの要素を操作する場合に使用するタグです。 ごく簡単なWebアプリケーションを作成する場合ですら、必須のタグであると言って良いです。たぶん。 しかしながら、にはある落とし穴が存在します。 落…

コードレベルで変数のスコープを管理するカスタムタグ

初めまして。ルート42株式会社の高橋と申します。 弊社では自社プロダクトの一つとしてフルスタックフレームワークの構築をしています。 その過程で得られたノウハウを、備忘録も兼ねてブログで公開してみることにしました。 不定期の更新になると思いますが…