New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #654: insecure errors in some plugins using DiaryContainer #656

Merged
merged 2 commits into from Dec 28, 2017

Conversation

Projects
None yet
4 participants
@tdtds
Member

tdtds commented Dec 27, 2017

maybe fix #654 and tdiary/tdiary-blogkit#17

ようするに内部でDiaryContainerクラスを使おうとするとautoloadが走ってセキュリティエラーになる、ということなので、とりあえず明示的にrequireするようにした。

@hsbt

hsbt approved these changes Dec 27, 2017

なるほど autoload しんどい。plugin の中で明示するのは副作用はないので良いと思います。

@metalefty

This comment has been minimized.

metalefty commented Dec 27, 2017

ありがとうございます。確認します。

@metalefty

This comment has been minimized.

metalefty commented Dec 27, 2017

当該プラグインでエラーは出なくなりましたが、芋づる式に別のエラーが出ています。

SecurityError

Insecure operation - require

/tdiary-debug/lib/tdiary/compatible.rb:57:in `require'
/tdiary-debug/lib/tdiary/compatible.rb:57:in `load'
/tdiary-debug/lib/tdiary/compatible.rb:57:in `load'
/home/www/.rbenv/versions/2.4.3/lib/ruby/2.4.0/pstore.rb:417:in `load_data'
/home/www/.rbenv/versions/2.4.3/lib/ruby/2.4.0/pstore.rb:328:in `transaction'
/tdiary-debug/lib/tdiary/compatible.rb:33:in `transaction'
/tdiary-debug/lib/tdiary/cache/file.rb:40:in `restore_parser_cache'
/tdiary-debug/lib/tdiary/io/default.rb:179:in `transaction'
/tdiary-debug/lib/tdiary/view.rb:262:in `initialize'
/tdiary-debug/lib/tdiary/diary_container.rb:25:in `new'
/tdiary-debug/lib/tdiary/diary_container.rb:25:in `initialize'
/tdiary-debug/lib/tdiary/diary_container.rb:15:in `new'
/tdiary-debug/lib/tdiary/diary_container.rb:15:in `find_by_month'
(plugin/recent_list.rb):35:in `block (3 levels) in recent_list'
(plugin/recent_list.rb):34:in `reverse_each'
(plugin/recent_list.rb):34:in `block (2 levels) in recent_list'
(plugin/recent_list.rb):33:in `reverse_each'
(plugin/recent_list.rb):33:in `block in recent_list'
(plugin/recent_list.rb):32:in `catch'
(plugin/recent_list.rb):32:in `recent_list'
(TDiary::Plugin#eval_src):515:in `block in eval_src'
/tdiary-debug/lib/tdiary/plugin.rb:106:in `eval'
/tdiary-debug/lib/tdiary/plugin.rb:106:in `block in eval_src'
/tdiary-debug/lib/tdiary/core_ext.rb:120:in `block in safe'
/tdiary-debug/lib/tdiary/core_ext.rb:122:in `safe'
/tdiary-debug/lib/tdiary/plugin.rb:105:in `eval_src'
/tdiary-debug/lib/tdiary/base.rb:65:in `do_eval_rhtml'
/tdiary-debug/lib/tdiary/base.rb:29:in `eval_rhtml'
/tdiary-debug/lib/tdiary/dispatcher/index_main.rb:37:in `run'
/tdiary-debug/lib/tdiary/dispatcher/index_main.rb:5:in `run'
/tdiary-debug/lib/tdiary/dispatcher.rb:25:in `dispatch_cgi'
index.rb:33:in `<main>'

compatible.rbの57行目というと、Marshal::loadしている部分です。まだ何かrequireしなければならない気がするのですが、Marshalrequireしなくても使えるので見当がつきません。再現は#654の環境、方法で行っています。

        private

        def load(content)
                table = Marshal::load(content)
                raise PStoreRuby18Exception.new if !table[:__ruby_version] || table[:__ruby_version] < '1.9'
                # hide __ruby_version to caller
                table.delete(:__ruby_version)
                table
@tdtds

This comment has been minimized.

Member

tdtds commented Dec 28, 2017

このMarshalが走っているということは、そうとう古いPStoreファイルを読み出そうとしているってことですね。insecureになるのはloadしたデータがrequireを必要としているからでしょう。
エラーの前の段階にcache/file.rbがあるので、キャッシュに古すぎるフォーマットのものが含まれている可能性が高いです。cacheディレクトリをいったん空にしてから実行してみてもらえますか?

@tdtds

This comment has been minimized.

Member

tdtds commented Dec 28, 2017

あ、ちがう、PStoreRuby18Exceptionが発生しているわけではないのか。うーん……でもまぁ「キャッシュを削除してみる」は最初の手としてお願いします。

@metalefty

This comment has been minimized.

metalefty commented Dec 28, 2017

キャッシュを削除したところ、下記のエラーに変わりました。ちなみに日記データは2007年からのものです。

SecurityError

Insecure operation - require

/tdiary-debug/lib/tdiary/io/default.rb:37:in `require'
/tdiary-debug/lib/tdiary/io/default.rb:37:in `block (2 levels) in restore_comment'
/tdiary-debug/lib/tdiary/io/default.rb:34:in `each'
/tdiary-debug/lib/tdiary/io/default.rb:34:in `block in restore_comment'
/tdiary-debug/lib/tdiary/io/default.rb:24:in `open'
/tdiary-debug/lib/tdiary/io/default.rb:24:in `restore_comment'
/tdiary-debug/lib/tdiary/io/default.rb:183:in `transaction'
/tdiary-debug/lib/tdiary/view.rb:262:in `initialize'
/tdiary-debug/lib/tdiary/diary_container.rb:25:in `new'
/tdiary-debug/lib/tdiary/diary_container.rb:25:in `initialize'
/tdiary-debug/lib/tdiary/diary_container.rb:15:in `new'
/tdiary-debug/lib/tdiary/diary_container.rb:15:in `find_by_month'
(plugin/recent_list.rb):34:in `block (3 levels) in recent_list'
(plugin/recent_list.rb):33:in `reverse_each'
(plugin/recent_list.rb):33:in `block (2 levels) in recent_list'
(plugin/recent_list.rb):32:in `reverse_each'
(plugin/recent_list.rb):32:in `block in recent_list'
(plugin/recent_list.rb):31:in `catch'
(plugin/recent_list.rb):31:in `recent_list'
(TDiary::Plugin#eval_src):515:in `block in eval_src'
/tdiary-debug/lib/tdiary/plugin.rb:106:in `eval'
/tdiary-debug/lib/tdiary/plugin.rb:106:in `block in eval_src'
/tdiary-debug/lib/tdiary/core_ext.rb:120:in `block in safe'
/tdiary-debug/lib/tdiary/core_ext.rb:122:in `safe'
/tdiary-debug/lib/tdiary/plugin.rb:105:in `eval_src'
/tdiary-debug/lib/tdiary/base.rb:65:in `do_eval_rhtml'
/tdiary-debug/lib/tdiary/base.rb:29:in `eval_rhtml'
/tdiary-debug/lib/tdiary/dispatcher/index_main.rb:37:in `run'
/tdiary-debug/lib/tdiary/dispatcher/index_main.rb:5:in `run'
/tdiary-debug/lib/tdiary/dispatcher.rb:25:in `dispatch_cgi'
index.rb:33:in `<main>'

エラー箇所はこの部分でした。
https://github.com/tdiary/tdiary-core/blob/v5.0.6/lib/tdiary/io/default.rb#L37

同様に見様見真似でrequireを追加したところ、動くようになりました。

diff --git a/lib/tdiary/io/default.rb b/lib/tdiary/io/default.rb
index a1b707cc..acfa32a0 100644
--- a/lib/tdiary/io/default.rb
+++ b/lib/tdiary/io/default.rb
@@ -6,6 +6,7 @@
 #
 require 'fileutils'
 require 'tdiary/io/base'
+require 'tdiary/comment'
 
 module TDiary
        TDIARY_MAGIC_MAJOR = 'TDIARY2'
@tdtds

This comment has been minimized.

Member

tdtds commented Dec 28, 2017

うーん、こんどのはこちらでは再現しないんですが、状況は理解しました。autoloadが元凶ということはわかったのでこれはおいおい解消していくとして、とりあえずいただいたパッチをあてて明日の5.0.7はリリースしたいと思います。お手数おかけしました。

@tdtds tdtds merged commit b8c33a5 into master Dec 28, 2017

3 checks passed

continuous-integration/travis-ci/pr The Travis CI build passed
Details
continuous-integration/travis-ci/push The Travis CI build passed
Details
coverage/coveralls Coverage increased (+0.006%) to 84.157%
Details

@tdtds tdtds deleted the fix/insecure_error_in_recent_list branch Dec 28, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment