芋出し画像

🚫危険なevalず察凊方法。js python phpなど。蚀語系別evalの扱いの違いずCWE調べ 危険なプログラミング


危険ず蚀われおいるのはEVAL Injection 動的評䟡コヌドにおけるディレクティブの䞍適切な䞭和が原因ずされる

゜フトりェアが䞊流コンポヌネントから入力を受け取るが、動的評䟡呌び出しevalなどで入力を䜿甚する前にコヌド構文を䞭和(neutralizes)しおいない、たたは誀っお䞭和しおいる。

䞭和ずはこういうや぀か

むンゞェクションの問題は、倚皮倚様な問題を含んでいたす。このため、これらの匱点に぀いお議論する最も効果的な方法は、それらをむンゞェクションの匱点ずしお分類する明確な特城に泚目するこずです。最も重芁な問題は、すべおのむンゞェクション問題には共通点があるずいうこずです--すなわち、制埡プレヌンのデヌタをナヌザヌが制埡するデヌタプレヌンにむンゞェクションするこずができるずいうこずです。
぀たり、正圓なデヌタ・チャネルを通しおコヌドを送り蟌むこずで、プロセスの実行を倉曎するこずができるのです。
バッファオヌバヌフロヌや他の倚くの欠陥が、実行を埗るために䜕らかの問題をさらに利甚するこずを䌎うのに察し、むンゞェクション問題はデヌタを解析するだけでよい。このカテゎリヌの匱点の最も叀兞的な䟋は、SQLむンゞェクションずフォヌマット文字列脆匱性である。

https://cwe.mitre.org/data/definitions/94.html

たくさんあるむンゞェクション

CVE-2022-2054
Python コンパむラが eval() を䜿っお悪意のある文字列を Python コヌドずしお実行する
CVE-2021-22204
チェヌン: EXIF プロセッサコヌドの正芏衚珟が文字列の終端を正しく決定しおおらず (CWE-625)、eval むンゞェクション (CWE-95) を可胜にしおいたした。
CVE-2021-22205
連鎖: バックスラッシュの埌に改行が続くず、怜蚌ステップ(CWE-20)がバむパスされ、evalむンゞェクション(CWE-95)が可胜になる。
CVE-2008-5071
PHP プログラムにおける eval むンゞェクション。
CVE-2002-1750
Perl プログラムにおける eval むンゞェクション。
CVE-2008-5305
Perl プログラムにおける、ハむフンず数字のみを含むべき ID を䜿甚した Eval むンゞェクション。
CVE-2002-1752
Perl の eval 関数ぞのダむレクトコヌドむンゞェクション。
CVE-2002-1753
Perl プログラムぞの eval むンゞェクション。
CVE-2005-1527
Perl eval 関数ぞのダむレクトコヌドむンゞェクション。
CVE-2005-2837
Perl eval 関数ぞの盎接コヌドむンゞェクション。
CVE-2005-1921
MFV. ネストされるべきではないネストされた構造を䜿甚した、PHP eval 文ぞのコヌドむンゞェクション。
CVE-2005-2498
MFV. ネストされるべきではないネストされた構文を䜿甚した、PHP eval 文ぞのコヌドむンゞェクション。
CVE-2005-3302
フォヌマットされたファむルのフィヌルドから Python の eval 文ぞのコヌドむンゞェクション。
CVE-2007-1253
Python プログラムにおける eval むンゞェクション。
CVE-2001-1471
チェヌン eval むンゞェクションの結果。無効な倀によっお倉数の初期化が劚げられ、攻撃者によっお倉曎され、 埌で PHP の eval 文にむンゞェクションされる可胜性がありたす。
CVE-2007-2713
チェヌン リダむレクト埌の実行が eval むンゞェクションを誘発する。

javascriptではハッキリずeval() は危険だから䜿わないでください!ずたで蚀っおいる。

eval() は呌び出し元の暩限で枡されたコヌドを実行する危険な関数です。悪意のある第䞉者に圱響を受ける可胜性のある文字列で eval() を実行するず、あなたのりェブペヌゞ / 拡匵機胜の暩限でナヌザヌのマシン䞊で悪意のあるコヌドを実行しおしたう可胜性がありたす。

たばこの泚意曞きのようにあからさた、じゃなぜ存圚するんだ必芁悪

たばこの煙は、あなたや呚りの人が肺がん、虚血性心疟患、脳卒䞭になる危険性を高めたす。

https://www.marlboro.jp/login.html?resource=%2Fcontent%2Fpmj%2Fmarlboro%2Fhome.html&$$login$$=%24%24login%24%24&j_reason=unknown&j_reason_code=unknown

eval「俺に觊れるんじゃねえ」 力を封印しおいる

ほずんど、あなたの事食べちゃうから逃げなさいずいう森のくたさんのような矛盟した存圚のeval。もしくは自意識過剰。

䞻人公が森を出る途䞭にばったりず熊に出䌚い、お互いに芋合っおずいう郚分がある歌詞もある君は逃げないのか 銃を持っおいないようだけどず熊から蚀われお、䞻人公が走り出しお熊が远いかけおくる。

「挆黒の翌」ずいうキャラを挔じる、「䞭二病」の男子生埒。オカルト郚所属。氎色の髪に小柄で華奢な䜓栌が特城で、腕にはファッションで包垯を巻く本人曰く力を封印しおいる。

そもそもの話、LISPから登堎したeval

LISPはevalが最初に登堎した蚀語である。evalの実装によっお、最初のLISPむンタプリタが珟れたのである。それ以前は、LISPの匏はコンパむルされおいた。しかし䞀床evalが実装されるず、それは単玔な入力・評䟡・出力のルヌプ (REPL) の䞀郚ずしお䜿われるようになり、最初のLISPむンタプリタの基瀎を圢䜜った。LISPの埌のバヌゞョンのevalはコンパむラずしおも実装されおいる。

悪いのはEvalなんだろうか

Rubyはevalにスコヌプ芁玠を入れるこずで䜕かを免眪包垯をたくしようずしおいる。

重芁な点ずしお、IASマシンはプログラムずデヌタをひず぀のメモリに混圚させるこずを意図したほが最初の蚭蚈である。

MDNではfunctionを代わりに぀かっおくれずいう。

function looseJsonParse(obj){
   return Function('"use strict";return (' + obj + ')')();
}
console.log(looseJsonParse(
  "{a:(4-1), b:function(){}, c:new Date()}"
))

人々はなぜこれほどたでに危険ずいわれおいるevalを埌䞖に残そうずするのか

私達は火薬庫の䞭を静電気にすら泚意しお歩くのに、アンタたちはタバコをフカしお歩けず蚀う。

https://amzn.to/3Gso611

LISPに぀いおは、bootstrap問題の解消ずいうこずがある。

ブヌトストラップ問題 (Bootstrap problem) は、コンパむラをコンパむル察象のプログラミング蚀語で䜜成した際に、そのコンパむラの最初のコンパむルをどうするかずいった堎合を兞型的な䟋ずする、いわゆる「鶏ず卵」の圢をしたセルフホスティング環境の問題を指す。これを解決するための方匏をブヌトストラップ方匏ずいい、この問題を䜕ずかしお最初の完備した環境を䜜るこずをブヌトストラッピングずいう

コンパむラをコンパむラコンパむラゆうおもヌキヌ

この本によるずjavascriptはScheme(LISPç³»)に圱響を受けおいるからそのたたevalも匕き継いだのかもしれない。

evalに぀いおも前向きに曞いおある。ブレンダンアむク通称剃刀アむク垫匠は語る

完党な動的スコヌプずいうのは入れおたせんでした。ストヌルマンはEmacsにずっお重芁なものだずこだわっお、Elispをそれで満たしたしたが。Javascriptは抂ね静的スコヌプを持ち、倚少倉則的なずころがありたす。非垞に動的になる抜け穎があるのです。グロヌバルオブゞェクトず、with文ず、evalです。しかしmy以前のPerlのダラヌ倉数や、Tclのupvarやuplevelみたいなのずは違いたす。幎代にはそんなのがたくさんあっお、流行だったのです。ブレンダン・アむク coders at workP

この短時間にevalの可胜性をemacsずperlをディスりで挟み蟌むずいう抜矀な切れ味を芋せる剃刀アむク先茩。しかし、どういう぀もりでjsにeval関数が残っおいるかは、そのあずの圱響を受けた蚀語などからもわかる。あず創始者が認めおもmdnはevalを即廃止したい勢い。


Netscapeの経営陣はすぐに、アむクがJavaに䌌た構文を持ち、Schemeや他の既存のスクリプト蚀語に䌌おいない新しい蚀語を考案するこずが最良の遞択肢だず刀断したした。

いいぞ、ネスケ経営陣。英断だ

(define (eval-with-x prog a b)
 (let ((at-a (eval `(let ((x ',a)) ,prog)))
       (at-b (eval `(let ((x ',b)) ,prog))))
   (- at-b at-a)))

C蚀語にはevalはない、それはなぜか

LISPの流れをくたない限り、みんなSHELLにEVALを参考にしおevalを組み蟌んだのだろうか、そしお、shellほど暩限やコンテクストがしっかりしおいないので、evalを䜿うなず生み出しおおいお君たちは埌から危険だず蚀うのか。シザヌハンズ

C蚀語にはeval関数が盎接的に存圚しないのにはいく぀かの理由が考えられたす。

  1. 䜎レベル蚀語の性質: Cは䜎レベルの蚀語であり、メモリ管理や盎接的なハヌドりェアアクセスが可胜です。このような蚀語においお、ランタむム時に任意のコヌドを動的に評䟡・実行するevalのようなメカニズムは、安党性の芳点からリスクが高いです。

  2. コンパむル方匏: Cはコンパむル蚀語であり、゜ヌスコヌドは実行前に機械語にコンパむルされたす。evalは通垞、むンタプリタ蚀語で頻繁に䜿甚される機胜であり、ランタむム時に動的にコヌドを解釈・実行するこずが容易なむンタプリタの特性ず盞性が良いです。

  3. 耇雑性: evalを適切に実装するには、Cのランタむムにコンパむラやむンタプリタの䞀郚を組み蟌む必芁がありたす。これは非垞に耇雑で、Cのシンプルさや効率性に圱響を䞎える可胜性がありたす。

  4. 安党性: 䞊述したように、evalを䜿甚するず任意のコヌドが実行されるため、セキュリティ䞊のリスクが高たりたす。䞍正なコヌドや意図しない動䜜を匕き起こす可胜性があるため、特に䜎レベル蚀語のCにおいおは、このような機胜が避けられるこずが倚いです。

  5. 特定の目的: C蚀語は䞻にシステムプログラミングや組み蟌みプログラムの開発のために蚭蚈されたした。このような甚途では、evalのような動的コヌド実行機胜はあたり求められないこずが倚いです。

もちろん、特定の状況や芁求に応じお、Cで自前のevalのような機胜を実装するこずは技術的に可胜です䟋: 倖郚のコンパむラを呌び出しおコヌドをコンパむル・実行する。しかし、C蚀語の蚭蚈思想や甚途を考慮するず、暙準ラむブラリにevalが含たれおいないのは理解しやすいでしょう。

Phpは譊告レベルで非掚奚、でもちゃあんず䜿えるけどね

è­Šå‘Š
eval() は非垞に危険な蚀語構造です。 ずいうのも、任意の PHP コヌドを実行できおしたうからです。 これを䜿うこずはおすすめしたせん。 いろいろ怜蚎した結果どうしおも䜿わざるを埗なくなった堎合は、现心の泚意を払っお䜿いたしょう。 ナヌザヌから受け取ったデヌタをそのたた枡しおはいけたせん。 枡す前に、適切な怜蚌が必芁です。

Perlは犁止するこずはないみたいだった。

さすがラクダのperl。ね、なんでもできるでしょ、ずいった感じ



お願い臎したす