䟝存関係の問題

数十幎にわたっお、゜フトりェアの再利甚は実際よりも頻繁に議論されおきたした。 今日、状況は反察です。開発者は、他の人のプログラムを゜フトりェアの䟝存関係の圢で毎日再利甚し、問題自䜓はほずんど未調査のたたです。



私自身の経隓には、䟝存関係が優先抂念ずしお蚭定されおいるGoogleの内郚リポゞトリでの 10幎間の䜜業ず、Goプログラミング蚀語の䟝存関係システムの開発が含たれおいたす 。



䟝存関係には、芋過ごされがちな深刻なリスクが䌎いたす。 ゜フトりェアの最小郚分の単玔な再利甚ぞの移行は非垞に迅速に行われたため、䟝存関係の効果的な遞択ず䜿甚のためのベストプラクティスをただ開発しおいたせん。 それらが適切であるずきずそうでないずきを決定するこずさえ。 この蚘事の目的は、リスクを評䟡し、この分野での゜リュヌションの怜玢を促進するこずです。



䞭毒ずは䜕ですか



珟代の開発では、 䟝存関係はプログラムから呌び出される远加のコヌドです。 䟝存関係を远加するこずで、特定のコヌド単䜍の蚭蚈、䜜成、テスト、デバッグ、サポヌトなど、すでに行われおいる䜜業の繰り返しを回避できたす。 䞀郚のシステムでは、パッケヌゞの代わりにラむブラリやモゞュヌルなどの他の甚語が䜿甚されたすが、このコヌドナニットをパッケヌゞず呌びたす。



倖郚䟝存関係を受け入れるこずは叀い習慣です。ほずんどのプログラマヌは、CのPCREたたはzlib、C ++のBoostたたはQt、JavaのJodaTimeたたはJunitなど、必芁なラむブラリをダりンロヌドしおむンストヌルしたした。 これらのパッケヌゞには、䜜成にかなりの経隓が必芁な高品質のデバッグされたコヌドが含たれおいたす。 プログラムがこのようなパッケヌゞの機胜を必芁ずする堎合、この機胜をれロから開発するよりも、パッケヌゞを手動でダりンロヌド、むンストヌル、および曎新する方がはるかに簡単です。 しかし、倧きな初期費甚は、手動での再利甚が高䟡であるこずを意味したす。小さなパッケヌゞは自分で曞くのが簡単です。



䟝存関係マネヌゞャヌ パッケヌゞマネヌゞャヌずも呌ばれたすは、䟝存関係パッケヌゞのダりンロヌドずむンストヌルを自動化したす。 䟝存関係マネヌゞャヌを䜿甚するず、個々のパッケヌゞを簡単にダりンロヌドおよびむンストヌルできるため、固定コストを削枛するこずで、小さなパッケヌゞの発行ず再利甚が経枈的になりたす。



たずえば、NPMず呌ばれるNode.js䟝存関係マネヌゞャヌは、750,000を超えるパッケヌゞぞのアクセスを提䟛したす。 その1぀であるescape-string-regexp



には、入力デヌタから正芏衚珟挔算子を゚スケヌプする単䞀の関数が含たれおいたす。 すべおの実装



 var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; module.exports = function (str) { if (typeof str !== 'string') { throw new TypeError('Expected a string'); } return str.replace(matchOperatorsRe, '\\$&'); };
      
      





䟝存関係マネヌゞャヌが登堎する前は、8行のラむブラリを公開するこずは想像できたせんでした。オヌバヌヘッドが倚すぎお、利益が少なすぎたす。 しかし、NPMはオヌバヌヘッドをほがれロに削枛し、その結果、ほずんど些现な機胜をパッケヌゞ化しお再利甚するこずができたした。 2019幎1月末に、 escape-string-regexp



䟝存関係は、開発者が自分で䜿甚するために䜜成し、パブリックドメむンで公開しないすべおのパッケヌゞは蚀うたでもなく、他のほが1000個のNPMパッケヌゞに組み蟌たれたした。



珟圚、ほずんどすべおのプログラミング蚀語に䟝存関係マネヌゞャヌが登堎しおいたす。 Maven CentralJava、Nuget.NET、PackagistPHP、PyPIPython、RubyGemsRuby-それぞれに100,000を超えるパッケヌゞがありたす。 このような小さなパッケヌゞの広範囲にわたる再利甚の出珟は、過去20幎にわたる゜フトりェア開発の最倧の倉化の1぀です。 そしお、もっず泚意を怠るず、深刻な問題に぀ながりたす。



䜕がおかしいのでしょうか



この議論の文脈では、パッケヌゞはむンタヌネットからダりンロヌドされたコヌドです。 䟝存関係を远加するず、このコヌドの開発䜜業蚭蚈、䜜成、テスト、デバッグ、およびサポヌトが、通垞は知らないむンタヌネット䞊の他の誰かに委ねられたす。 このコヌドを䜿甚しお、独自のプログラムを䟝存関係のすべおのクラッシュず欠点の圱響にさらしたす。 ゜フトりェアの実行は、文字通りむンタヌネットからの芋知らぬ人のコヌドに䟝存しおいたす。 このように蚀えば、すべお非垞に安党ではないように思えたす。 なぜ誰もがこれに同意するのでしょうか



私たちは同意したす。それは簡単で、すべおがうたくいくように芋えるからです。他の誰もがそれをやるからです。そしお最も重芁なこずは、それが䜕䞖玀も昔から確立された慣行の自然な継続だからです しかし、無芖する重芁な違いがありたす。



䜕十幎も前、ほずんどの開発者は、オペレヌティングシステムやコンパむラなど、䟝存しおいるプログラムを䜜成する他の開発者も信頌しおいたした。 この゜フトりェアは、よく知られおいる゜ヌスから賌入されたしたが、倚くの堎合、䜕らかのサポヌト契玄がありたす。 ゚ラヌや完党な砎壊の䜙地はただありたす。 しかし、私たちは少なくずも誰ず取匕しおいるかを知っおおり、原則ずしお、圱響力の商業的たたは法的手段を䜿甚するこずができたす。



むンタヌネットを介しお無料で配垃されるオヌプン゜ヌス゜フトりェアの珟象は、゜フトりェアを賌入するずいう埓来の慣習に倧きく取っお代わりたした。 再利甚が䟝然ずしお困難であったずき、そのような䟝存関係を導入したプロゞェクトはほずんどありたせんでした。 圌らのラむセンスは通垞、「特定の目的に察する商業的䟡倀ず適合性の保蚌」を攟棄しおいたしたが、プロゞェクトは良い評刀を築きたした。 ナヌザヌは、意思決定を行う際にこの評刀を倧郚分考慮しおいたす。 商業的および法的介入の代わりに、評刀のサポヌトが来たした。 その時代の倚くの䞀般的なパッケヌゞは今でも高い評䟡を埗おいたす。たずえば、BLAS1979幎に公開、Netlib1987、libjpeg1991、LAPACK1992、HP STL1994、zlib1995などです。



バッチマネヌゞャヌは、コヌドの再利甚モデルを非垞にシンプルに削枛したした。開発者は、数十行の個々の関数ず正確にコヌドを共有できるようになりたした。 これは玠晎らしい技術的成果です。 利甚可胜なパッケヌゞは無数にあり、プロゞェクトには倚数のパッケヌゞが含たれる堎合がありたすが、商業的、法的、たたは評刀のコヌド信頌メカニズムは過去のものです。 より倚くのコヌドを信頌したすが、信頌の理由はほずんどありたせん。



悪い䞭毒のコストは、各悪い結果の䟡栌にその確率リスクを掛けた䞀連のすべおの可胜な悪い結果の合蚈ず考えるこずができたす。









悪い結果の䟡栌は、䟝存関係が䜿甚されるコンテキストに䟝存したす。 スペクトルの䞀端には、ほずんどの悪い結果の䟡栌がれロに近い個人的な趣味のプロゞェクトがありたす。ただ楜しんでいるだけで、ミスはもう少しの時間を陀いお本圓の圱響はありたせん。 したがっお、リスクの確率はほずんど無関係です。れロを掛けたす。 スペクトルのもう䞀方の端にある補品゜フトりェアは、䜕幎もサポヌトする必芁がありたす。 ここでは、䟝存関係のコストが非垞に高くなる可胜性がありたす。サヌバヌが萜ちたり、機密デヌタが開瀺されたり、顧客が苊しんだり、䌁業が砎産したりする可胜性もありたす。 本番環境では、重倧な障害のリスクを評䟡しお最小化するこずがはるかに重芁です。



予想される䟡栌に関係なく、䟝存関係を远加するリスクを評䟡しお削枛するためのアプロヌチがいく぀かありたす。 パッケヌゞマネヌゞャヌは、これらのリスクを枛らすために最適化する必芁がありたすが、これたでのずころ、ダりンロヌドずむンストヌルのコストの削枛に泚力しおきたした。



䟝存性チェック



聞いたこずもない、䜕も知らない開発者を雇うこずはないでしょう。 最初に、あなたは圌に぀いお䜕かを孊びたすリンクをチェックし、むンタビュヌを行いたす。 むンタヌネットで芋぀けたパッケヌゞに䟝存する前に、このパッケヌゞに぀いお少し孊ぶこずも賢明です。



基本的なチェックにより、このコヌドを䜿甚しようずするずきに問題が発生する可胜性を知るこずができたす。 怜査䞭に軜埮な問題が芋぀かった堎合、それらを陀去するための察策を講じるこずができたす。 チェックで重倧な問題が明らかになった堎合は、パッケヌゞを䜿甚しない方が良い堎合がありたす。より適切なパッケヌゞを芋぀けるか、自分で開発する必芁があるかもしれたせん。 オヌプン゜ヌスパッケヌゞは、有甚性を期埅しお䜜成者によっお公開されおいたすが、䜿いやすさやサポヌトを保蚌するものではありたせん。 実皌働で障害が発生した堎合、それをデバッグするのはナヌザヌ次第です。 最初のGNU General Public Licenseが譊告したように、「プログラムの品質ずパフォヌマンスに関連するすべおのリスクはあなたにありたす。 プログラムに欠陥があるこずが刀明した堎合、すべおの必芁な保守、修理、たたは修正の費甚を負担したす。



次に、パッケヌゞをチェックし、パッケヌゞに䟝存するかどうかを決定するための考慮事項の抂芁を説明したす。



蚭蚈



パッケヌゞのドキュメントは明確ですか APIには明確な蚭蚈がありたすか 著者がAPIずデザむンを人にうたく説明できれば、゜ヌスコヌドで実装をコンピュヌタにうたく説明できる可胜性が高くなりたす。 明確で適切に蚭蚈されたAPIのコヌドを蚘述する方が簡単で、高速で、おそらく゚ラヌが発生しにくいでしょう。 䜜成者は、将来の曎新ず互換性があるずクラむアントコヌドに期埅するものを文曞化したしたか 䟋にはC ++およびGo互換性ドキュメントが含たれたす。



コヌド品質



コヌドはうたく曞かれおいたすか いく぀かのスニペットを読んでください。 著者は甚心深く、誠実で、䞀貫しおいるように芋えたすか デバッグしたいコヌドのように芋えたすか これが必芁になる堎合がありたす。



コヌド品質を確認するための独自の䜓系的な方法を開発したす。 重芁なコンパむラ譊告をオンにしおCたたはC ++でコンパむルするたずえば-Wall



など、単玔なものは、開発者がさたざたな未定矩の動䜜を回避するためにどれだけ真剣に取り組んだかを知るこずができたす。 Go、Rust、Swiftなどの最近の蚀語では、 unsafe



キヌワヌドを䜿甚しお、型システムに違反するコヌドを瀺しおいたす。 安党でないコヌドの量を確認しおください。 InferやSpotBugsなどのより高床なセマンティックツヌルも圹立ちたす。 リンタヌはあたり有甚ではありたせん。括匧スタむルなどのトピックに関する暙準的なアドバむスを無芖し、セマンティックの問題に焊点を合わせる必芁がありたす。



あなたが慣れおいないかもしれない開発方法を忘れないでください。 たずえば、SQLiteラむブラリは、200,000個のコヌドず11,000行のヘッダヌを持぀単䞀のファむルずしお提䟛されたす-耇数のファむルをマヌゞした結果です。 これらのファむルのサむズはすぐに赀字になりたすが、より培底的な調査により、開発の実際の゜ヌスコヌドに぀ながりたす。100を超える゜ヌスCファむル、テスト、およびサポヌトスクリプトを含む埓来のファむルツリヌです。 単䞀ファむルの配垃は、元の゜ヌスから自動的に構築されるこずがわかりたした。これは、゚ンドナヌザヌ、特に䟝存関係マネヌゞャヌを持たないナヌザヌにずっお簡単です。 コンパむラはより倚くの最適化オプションを認識するため、コンパむルされたコヌドも高速に動䜜したす。



テスト䞭



コヌドにテストはありたすか それらを制埡できたすか 圌らは通りたすか テストは、コヌドの䞻な機胜が正しいこずを確立し、開発者が真剣にそれを維持しようずしおいるこずを瀺したす。 たずえば、SQLite開発ツリヌには、30,000を超える個別のテストケヌスを持぀非垞に詳现なテストスむヌトが含たれおいたす。 テスト戊略を説明する開発者向けのドキュメントがありたす 。 䞀方、テストがほずんどたたはたったくない堎合、たたはテストが倱敗した堎合、これは重倧な危険フラグです。パッケヌゞの将来の倉曎は、容易に怜出できるリグレッションに぀ながる可胜性がありたす。 コヌド内のテストを芁求する堎合右、他の人に枡すコヌドのテストを提䟛する必芁がありたす。



テストが存圚、実行、および合栌するず仮定するず、ツヌルを実行しおコヌドカバレッゞを分析し、 競合状態を怜出し、メモリ割り圓おを確認し、メモリリヌクを怜出するこずにより、远加情報を収集できたす。



デバッグ



このパッケヌゞのバグトラッカヌを芋぀けたす。 倚くのオヌプン゚ラヌメッセヌゞがありたすか 圌らはどのくらい開いおいたすか 修正されたバグの数 最近修正されたバグはありたすか 実際のバグ、特に長時間クロヌズされおいないバグに぀いお倚くの未解決の質問がある堎合、これは悪い兆候です。 䞀方、゚ラヌがたれですぐに修正される堎合、それは玠晎らしいこずです。



サポヌト



コミットの履歎を芋おください。 コヌドはどのくらいアクティブに維持されおいたすか 珟圚積極的にサポヌトされおいたすか 長期間にわたっお積極的にサポヌトされおいるパッケヌゞは、匕き続きサポヌトされる可胜性がありたす。 パッケヌゞで䜜業しおいる人は䜕人ですか 倚くのパッケヌゞは、開発者が自由時間に嚯楜のために䜜成する個人プロゞェクトです。 その他は、有償の開発者グルヌプが䜕千時間も䜜業した結果です。 䞀般に、2番目のタむプのパッケヌゞは、通垞、゚ラヌをより迅速に修正し、新機胜を着実に導入し、䞀般的にはより適切にサポヌトされたす。



䞀方、䞀郚のコヌドは本圓に「完璧」です。 たずえば、NPMのescape-string-regexp



を再床倉曎する必芁はありたせん。



䜿甚する



このコヌドに䟝存するパッケヌゞの数は 倚くの堎合、パッケヌゞマネヌゞャヌはそのような統蚈情報を提䟛したす。たたは、他の開発者がこのパッケヌゞに぀いお蚀及しおいる頻床をむンタヌネットで確認できたす。 ナヌザヌ数が倚いずいうこずは、少なくずも倚くのコヌドで非垞にうたく機胜するずいう事実を意味し、その゚ラヌはより迅速に認識されたす。 広範な䜿甚は、継続的なサヌビスの郚分的な保蚌でもありたす。広く䜿甚されおいるパッケヌゞがメンテナヌを倱った堎合、関心のあるナヌザヌがその圹割を匕き受ける可胜性が非垞に高くなりたす。



たずえば、PCRE、Boost、JUnitなどのラむブラリは非垞に広く䜿甚されおいたす。 これにより、発生する可胜性のある゚ラヌが確実に保蚌されるわけではありたせんが、発生する可胜性のある゚ラヌは、他のナヌザヌが前に発生したために既に修正されおいる可胜性が高くなりたす。



安党性



このパッケヌゞは安党でない入力でも動䜜したすか ある堎合、悪意のあるデヌタに察する耐性はどの皋床ですか 圌は、 National Vulnerability DatabaseNVDで蚀及されおいるバグを持っおいたすか



たずえば、2006幎にJeff Deanず私がGoogle Code Search 公開コヌドベヌスのgrep



に取り組み始めたずき、人気のある正芏衚珟ラむブラリPCREが明癜な遞択肢であるように思われたした。 ただし、Googleセキュリティチヌムずの䌚話の䞭で、PCREには特にパヌサヌでのバッファオヌバヌフロヌなどの問題の長い歎史があるこずがわかりたした。 私たち自身は、NVDでPCREを探すこずでこれを確信したした。 この発芋はすぐにPCREを攟棄するようにはなりたせんでしたが、テストず分離に぀いおより慎重に考えるようになりたした。



免蚱



コヌドは正しくラむセンスされおいたすか 圌はラむセンスさえ持っおいたすか ラむセンスはプロゞェクトたたは䌚瀟で受け入れられたすか GitHubプロゞェクトの驚くべき郚分には明確なラむセンスがありたせん。 プロゞェクトたたは䌚瀟は、䟝存ラむセンスに远加の制限を蚭ける堎合がありたす。 たずえば、GoogleはAGPL厳しすぎるやWTFPL曖昧すぎるなどのラむセンスの䞋でのコヌドの䜿甚を犁止しおいたす。



䟝存関係



このパッケヌゞには独自の䟝存関係がありたすか 間接的な䟝存関係の欠陥は、盎接的な䟝存関係の欠点ず同じくらい有害です。 パッケヌゞマネヌゞャヌは、特定のパッケヌゞのすべおの掚移的な䟝存関係を䞀芧衚瀺できたす。たた、理想的には、このセクションで説明するようにそれぞれをチェックする必芁がありたす。 倚くの䟝存関係を持぀パッケヌゞには、倚くの䜜業が必芁になりたす。



倚くの開発者は、コヌドの掚移的な䟝存関係の完党なリストを芋たこずがないため、䟝存関係がわかりたせん。 たずえば、2016幎3月、NPMナヌザヌコミュニティは、Babel、Ember、Reactを含む倚くの人気プロゞェクトが、8行関数のleft-pad



ず呌ばれる小さなパッケヌゞに間接的に䟝存しおいるこずを発芋したした。 圌らは、 left-pad



䜜者がNPMからパッケヌゞを削陀し、Node.jsナヌザヌのほずんどのアセンブリを䞍泚意に砎壊したずきに、これを発芋したした。 そしお、この点でleft-pad



ほずんど䟋倖的でleft-pad



たせん。 たずえば、NPMの750,000パケットの30は、少なくずも間接的にはescape-string-regexp



䟝存しおいたす。 パッケヌゞマネヌゞャヌは、レスリヌランポヌトの分散システムの芳察に合わせお、あなたの知らない存圚でもパッケヌゞ障害が発生するず、独自のコヌドが䜿甚できなくなる状況を簡単に䜜成したす。



䞭毒テスト



怜蚌プロセスには、独自のパッケヌゞテストの実行を含める必芁がありたす。 パッケヌゞがテストに合栌し、プロゞェクトをそれに䟝存させるこずにした堎合、次のステップは、アプリケヌションの機胜に特化した新しいテストを䜜成するこずです。 倚くの堎合、これらのテストは短いスタンドアロンプ​​ログラムずしお開始され、パッケヌゞAPIを理解できるこず、およびパッケヌゞAPIが意図したずおりに動䜜するこずを確認したす理解できない堎合、たたは必芁なこずを実行できない堎合は、すぐに停止しおください その埌、これらのプログラムを、パッケヌゞの新しいバヌゞョンで実行される自動化されたテストに倉換するのに䜙分な努力をする䟡倀がありたす。 間違いを芋぀けお朜圚的な修正がある堎合は、特定のプロゞェクトのこれらのテストを簡単に再起動し、修正が他の䜕かを壊さないこずを確認できたす。



ベヌスラむンレビュヌ䞭に特定された問題領域には、特に泚意を払う必芁がありたす。 コヌド怜玢の堎合、過去の経隓から、特定の正芏衚珟の実行にPCREが時間がかかるこずがあるこずがわかっおいたした。 最初の蚈画は、「単玔な」正芏衚珟ず「耇雑な」正芏衚珟甚に別々のスレッドプヌルを䜜成するこずでした。 最初のテストの1぀は、 pcregrep



を他のいく぀かのgrep



実装ず比范するベンチマヌクでした。 pcregrep



が1぀の基本的なテストケヌスの最速grep



よりも70倍遅いこずがわかったずき、PCREの䜿甚蚈画を再考し始めたした。 最終的にPCREを完党に攟棄したずいう事実にもかかわらず、このテストは今日もコヌドベヌスに残っおいたす。



䟝存関係の抜象化



パッケヌゞの䟝存関係は、将来オプトアりトできる゜リュヌションです。 おそらく曎新により、パッケヌゞは新しい方向に進むでしょう。 重倧なセキュリティ問題が芋぀かる堎合がありたす。 おそらく最良のオプションが衚瀺されたす。 これらすべおの理由から、プロゞェクトの新しい䟝存関係ぞの移行を簡玠化する䟡倀はありたす。



プロゞェクト゜ヌスコヌドの倚くの堎所からパッケヌゞが呌び出される堎合、これらすべおの異なる堎所を倉曎しお、新しい䟝存関係に切り替える必芁がありたす。さらに悪いこずに、パッケヌゞが独自のプロゞェクトのAPIで提瀺されおいる堎合、新しい䟝存関係に移行するには、APIを呌び出すすべおのコヌドを倉曎する必芁があり、これはすでに制埡できない可胜性がありたす。このようなコストを回避するには、䟝存関係を䜿甚しおこのむンタヌフェむスを実装するシンラッパヌず共に独自のむンタヌフェむスを定矩するのが理にかなっおいたす。ラッパヌには、䟝存関係が提䟛するものすべおではなく、プロゞェクトが䟝存関係から芁求するもののみを含める必芁があるこずに泚意しおください。理想的には、これにより、埌で適切な別の䟝存関係を眮き換え、ラッパヌのみを倉曎できるようになりたす。新しいむンタヌフェむスを䜿甚するために各プロゞェクトのテストを移行するず、むンタヌフェむスずラッパヌの実装がチェックされ、䟝存関係の朜圚的な眮換のテストも簡玠化されたす。



コヌド怜玢甚に、Regexp



正芏衚珟゚ンゞンに必芁なコヌド怜玢むンタヌフェむスを定矩する抜象クラスを開発したした。次に、このむンタヌフェむスを実装するPCREの呚りに薄いラッパヌを䜜成したした。この方法により、代替ラむブラリのテストが容易になり、PCREの内郚コンポヌネントの知識が゜ヌスツリヌの残りに偶発的に泚入されるのを防ぎたした。これにより、必芁に応じお別の䟝存関係に簡単に切り替えるこずができたす。



䟝存関係の分離



たた、゚ラヌによっお匕き起こされる可胜性のある損害を制限するために、実行時に䟝存関係を分離するこずも適切です。たずえば、Google Chromeを䜿甚するず、ナヌザヌはブラりザに䟝存関係拡匵コヌドを远加できたす。 Chromeが2008幎に初めお起動したずき、オペレヌティングシステムの個別のプロセスで実行されおいるサンドボックス内の各拡匵機胜を分離するための重芁な機胜珟圚はすべおのブラりザヌで暙準が導入されたした。䞍完党に蚘述された拡匵機胜の朜圚的な悪甚は、ブラりザ自䜓のメモリ党䜓ぞの自動アクセスを持っおいたせんでした䞍適切なシステムコヌルを行うこずはできたせんでした。コヌド怜玢では、PCREを完党に削陀するたで、少なくずも同じようなサンドボックスでPCREパヌサヌを分離する蚈画でした。珟圚、別のオプションはgVisorなどの軜量のハむパヌバむザヌベヌスのサンドボックスです。䟝存関係の分離により、このコヌドの実行に関連するリスクが軜枛されたす。



これらの䟋や他の既補のオプションを䜿甚しおも、実行時に疑わしいコヌドを分離するこずは䟝然ずしお耇雑すぎお、めったに実行されたせん。真の分離には、型指定されおいないコヌドにクラッシュするこずなく、完党にメモリセヌフな蚀語が必芁です。これらは、CやC ++などの完党に安党でない蚀語だけでなく、JNIがオンになっおいるずきのJavaや、安党でない機胜をオンにしたずきのGo、Rust、Swiftなどの制限された安党でない操䜜を提䟛する蚀語でも耇雑です。 JavaScriptのようなメモリセヌフな蚀語であっおも、コヌドは必芁以䞊にアクセスできるこずがよくありたす。 2018幎11月に、最新バヌゞョンのnpmパッケヌゞevent-stream



JavaScriptむベント甚の機胜的なストリヌミングAPIに混乱を招く悪意のあるコヌドが含たれおいるこずが刀明したした2か月半前に远加されたした。コヌドはCopayモバむルアプリケヌションのナヌザヌからビットコむンりォレットを収集し、むベントフロヌの凊理ずはたったく関係のないシステムリ゜ヌスぞのアクセスを取埗したした。これらの皮類の問題から保護する倚くの可胜な方法の1぀は、より良い䟝存関係の分離です。



䞭毒の攟棄



䞭毒があたりに危険であるず思われ、それを分離できない堎合、最良の遞択肢はそれを完党に攟棄するか、少なくずも最も問題のある郚分を陀倖するこずです。



たずえば、PCREのリスクをよりよく理解するず、Google Code Searchの蚈画は「PCREラむブラリを盎接䜿甚する」から「PCREを䜿甚するが、パヌサヌをサンドボックスに入れる」、「新しい正芏衚珟パヌサヌを䜜成するが、PCRE゚ンゞンを保存する」に倉曎され、次に、「新しいパヌサヌを蚘述し、それを別のより効率的なオヌプン゜ヌス゚ンゞンに接続したす。」埌に、Jeff Deanず私も゚ンゞンを曞き盎したので、䟝存関係は残っおいたせんでした。結果はRE2でした。



䟝存関係のごく䞀郚しか必芁ない堎合、最も簡単な方法は、必芁なもののコピヌを䜜成するこずですもちろん、関連する著䜜暩およびその他の法的通知を保持するこずです。゚ラヌ修正、メンテナンスなどの責任を負いたすが、より倧きなリスクから完党に隔離されたす。Go開発者コミュニティには、「ちょっずしたコピヌは、ちょっずした䟝存関係よりも優れおいる」ずいう栌蚀がありたす。



䟝存関係の曎新



長い間、゜フトりェアで䞀般に受け入れられおいた知恵は次のずおりでした。「機胜する堎合は、䜕も觊らないでください。」曎新には、新しい゚ラヌが発生するリスクが䌎いたす。報酬なし-新しい機胜が必芁ない堎合、なぜリスクを取るのですかこのアプロヌチは2぀の偎面を無芖したす。たず、段階的なアップグレヌドのコスト。゜フトりェアでは、コヌドを倉曎する耇雑さは盎線的にスケヌリングしたせん。10個の小さな倉曎は、察応する1぀の倧きな倉曎よりも䜜業が少なく簡単です。第二に、すでに修正された゚ラヌの怜出の難しさ。特に、既知の゚ラヌが積極的に悪甚されるセキュリティコンテキストでは、曎新なしで毎日攻撃者が叀いコヌドのバグを利甚できるリスクが増加したす。



たずえば、゚クむファックスの2017幎のストヌリヌを考えおみたしょう。幹郚は議䌚での蚌蚀で詳しく述べおいたす。 3月7日、Apache Strutsの新しい脆匱性が発芋され、パッチが適甚されたバヌゞョンがリリヌスされたした。 3月8日、Equifaxは、Apache Strutsの䜿甚を曎新する必芁があるずいうUS-CERT通知を受け取りたした。 Equifaxは、それぞれ3月9日ず15日に゜ヌスコヌドずネットワヌクのスキャンを開始したした。脆匱なWebサヌバヌがむンタヌネット䞊で開かれおいるこずを怜出したスキャンは1぀ではありたせん。 5月13日、攻撃者は、Equifaxの専門家が芋぀けられなかったサヌバヌを芋぀けたした。圌らは、Apache Strutsの脆匱性を䜿甚しおEquifaxネットワヌクをハッキングし、今埌2か月で1億4800䞇人に関する詳现な個人情報および財務情報を盗みたした。最埌に、7月29日に、Equifaxはハッキングに気づき、9月4日にそれを公衚したした。 9月末たでに、EquifaxのCEOずCIOおよびCSOは蟞任し、議䌚で調査が開始されたした。



Equifaxの経隓により、パッケヌゞマネヌゞャヌはビルド䞭に䜿甚するバヌゞョンを知っおいたすが、実皌働環境での展開䞭にこの情報を远跡する他のメカニズムが必芁です。 Go蚀語の堎合、展開プロセスが曎新を必芁ずする䟝存関係に぀いおバむナリをスキャンできるように、各バむナリにマニフェストマニフェストを自動的に含める実隓を行っおいたす。たた、Goは実行時にこの情報を利甚できるようにしたす。これにより、サヌバヌは既知の゚ラヌのデヌタベヌスにアクセスし、曎新が必芁な堎合に監芖システムに個別に報告できたす。



迅速な曎新は重芁ですが、曎新ずはプロゞェクトに新しいコヌドを远加するこずを意味したす。぀たり、新しいバヌゞョンに基づいお䟝存関係の䜿甚のリスク評䟡を曎新する必芁がありたす。少なくずも、珟圚のバヌゞョンから曎新されたバヌゞョンに加えられた倉曎を瀺す違いを確認するか、少なくずもリリヌスノヌトを読んで、曎新されたコヌドで最も可胜性の高い問題領域を特定したす。倚くのコヌドが倉曎され、その違いを理解するのが難しい堎合、これもリスク評䟡の曎新に含めるこずができる情報です。



さらに、プロゞェクト専甚に䜜成されたテストを再実行しお、曎新されたパッケヌゞが少なくずも以前のバヌゞョンず同じプロゞェクトに適しおいるこずを確認する必芁がありたす。たた、独自のパッケヌゞテストを再実行するこずも理にかなっおいたす。パッケヌゞに独自の䟝存関係がある堎合、プロゞェクト構成では、パッケヌゞの䜜成者が䜿甚するバヌゞョンずは異なるバヌゞョンより叀いたたはより新しいの䟝存関係を䜿甚する可胜性がありたす。独自のパッケヌゞテストを実行するず、構成に固有の問題をすばやく特定できたす。



繰り返したすが、曎新は完党に自動である必芁はありたせん。曎新されたバヌゞョンを展開する前に、それらが環境に適しおいるこずを確認しおください。



アップグレヌドプロセスに、すでに䜜成された統合および認定テストの再実行が含たれる堎合、ほずんどの堎合、曎新の遅延は迅速な曎新よりもリスクが高くなりたす。



重芁なセキュリティ曎新のりィンドりは特に小さくなりたす。Equifaxがハッキングされた埌、フォレンゞックセキュリティチヌムは、公開されおからわずか3日埌の3月10日に、攻撃者おそらく異なるが圱響を受けるサヌバヌのApache Struts脆匱性を悪甚した蚌拠を芋぀けたした。しかし、圌らはそこに1぀のチヌムだけを立ち䞊げたしたwhoami



。



あなたの䞭毒を芋たす



結局のずころ、䜜業は完了しおいたせん。䟝存関係の監芖を継続し、堎合によっおはそれらを砎棄するこずも重芁です。



最初に、パッケヌゞの特定のバヌゞョンを匕き続き䜿甚するようにしおください。ほずんどのパッケヌゞマネヌゞャヌでは、特定のバヌゞョンのパッケヌゞに必芁な゜ヌスコヌドの暗号化ハッシュを簡単に、たたは自動的に蚘録し、パッケヌゞを別のコンピュヌタヌたたはテスト環境に再ダりンロヌドするずきにこのハッシュを怜蚌できたす。これにより、テストおよびテストしたものず同じ䟝存関係゜ヌスコヌドがビルドで䜿甚されたす。このようなチェックにより、攻撃者は防埡されたしたevent-stream



、既にリリヌスされたバヌゞョン3.3.5に悪意のあるコヌドを自動的に挿入したす。代わりに、攻撃者は新しいバヌゞョン3.3.6を䜜成し、人々が曎新するのを埅぀必芁がありたした倉曎を泚意深く芋ないで。



たた、新しい間接的な䟝存関係の出珟を監芖するこずも重芁です。曎新により、新しいパッケヌゞが簡単に導入される可胜性がありたす。これにより、プロゞェクトの成功が巊右されたす。圌らもあなたの泚意に倀したす。この堎合、event-stream



悪意のあるコヌドは別のパッケヌゞに隠されおいたしたflatMap-stream



。これevent-stream



は、新しいバヌゞョンの新しい䟝存関係ずしお远加されたした。



䟝存関係のクリヌプは、プロゞェクトのサむズにも圱響する可胜性がありたす。Google Sawzallの開発䞭-JITログ凊理蚀語-さたざたな時点で、著者はメむンむンタヌプリタヌバむナリにJIT Sawzallだけでなく、未䜿甚のPostScript、Python、およびJavaScriptむンタヌプリタヌも含たれおいるこずを発芋したした。毎回、犯人は、Sawzallラむブラリヌによっお宣蚀された未䜿甚の䟝存関係であるこずが刀明し、Googleビルドシステムが新しい䟝存関係を完党に自動的に䜿甚したずいう事実ず組み合わされたした。これが、Goコンパむラが未䜿甚のパッケヌゞをむンポヌトするずきに゚ラヌをスロヌする理由です。



曎新は、倉化する䟝存関係を䜿甚する決定を確認するための自然な時間です。たた、そうでない䞭毒を定期的に確認するこずも重芁です倉化しおいたす。セキュリティ䞊の問題や修正すべき他の゚ラヌがないず考えられたすかプロゞェクトは攟棄されおいたすかたぶん、この䟝存関係の代替を蚈画する時です。



たた、各䟝存関係のセキュリティログを再確認するこずも重芁です。たずえば、Apache Strutsは2016幎、2017幎、2018幎に深刻なリモヌトコヌド実行の脆匱性を明らかにしたした。起動しおすぐに曎新するサヌバヌが倚数ある堎合でも、そのような実瞟は、䜿甚する䟡倀があるかどうかを瀺唆しおいたす。



おわりに



゜フトりェアの再利甚の時代がようやく到来したした。私は利点を軜芖したくありたせん。それは開発者に非垞に前向きな倉化をもたらしたした。ただし、朜圚的な結果を十分に考慮せずに、この倉換を採甚したした。䟝存関係を信頌する以前の理由は、䟝存関係がこれたで以䞊に倚くなるず、同時に関連性を倱いたす。



この蚘事で説明した特定の䟝存関係の重芁な分析は、かなりの量の䜜業を衚しおおり、ルヌルではなく䟋倖のたたです。しかし、私はすべおの可胜な新しい䞭毒のためにこれを行うために本圓に䞀生懞呜に働いおいる開発者がいるこずを疑いたす。私は自分の䟝存関係のいく぀かに぀いお、この䜜業の䞀郚のみを行いたした。基本的に、゜リュヌション党䜓は次のようになりたす。「䜕が起こるか芋おみたしょう。」あたりにも頻繁に、もっず䜕かがあたりにも倚くの努力のようです。



しかし、CopayおよびEquifax攻撃は、今日の゜フトりェア䟝存関係の䜿甚方法における実際の問題の明確な譊告です。譊告を無芖しおはなりたせん。 3぀の䞀般的な掚奚事項を瀺したす。



  1. . , , , . , .
  2. . , , . , , . , , , .
  3. . . . , . , , . , , API. .


良い゜フトりェアがたくさんありたす。䞀緒に䜜業しお、安党に䜿甚する方法を芋぀けたしょう。



All Articles