Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ReDoS 検出プログラム
 recheck の開発 / recheck: ReDoS check program

TSUYUSATO Kitsune
January 07, 2022
98

ReDoS 検出プログラム
 recheck の開発 / recheck: ReDoS check program

第63回 プログラミング・シンポジウム で発表した「ReDoS 検出プログラム
 recheck の開発」の発表スライドです。

TSUYUSATO Kitsune

January 07, 2022
Tweet

More Decks by TSUYUSATO Kitsune

Transcript

  1. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ όοΫτϥοΩϯάͰͷϚονϯάͷ ࠷ѱܭࢉྔ ਖ਼نදݱʹґଘ  ࢦ਺త ΍ଟ߲ࣜత 

     ͜ΕΛ༻͍ͨܭࢉྔෳࡶੑ߈ܸʮ3F%P4ʯ ೥ʹ͸3F%P4͕ݪҼͰɼ ͕෼ؒͷαʔϏεμ΢ϯʹؕͬͨɽ Θ(2n) Θ(nd) d ≥ 2 ͦ΋ͦ΋3F%P4ͱ͸ʁ  /^(a|a)*$/.exec('a'.repeat(n) + 'b') 
 ͷ࣮ߦ࣌ؒ ࣮ߦ࣌ؒ ඵ       ܁Γฦ͠ճ਺O      IUUQTTUBDLTUBUVTOFUQPTUPVUBHFQPTUNPSUFNKVMZ
  2. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ཧ࿦ʹΑΔ3F%P4ݕग़ͱ͸ҟͳΔΞϓϩʔνͱͯ͠ɼ 
 ಈతղੳతͳϑΝδϯάʹΑΔ3F%P4ݕग़͕͋Δ<4IFO "4&>ɽ ϑΝδϯάʹΑΔ3F%P4ݕग़  ਖ਼نදݱ࣮૷

    GPPCBS  fi [[CV[[ IPHF IVHB େྔͷจࣈྻ ೖྗ BBBBC Ϛονϯάʹ͕࣌ؒ 
 ͔͔Δ΋ͷΛൃݟ 3F%P4੬ऑੑͱͯ͠ใࠂ Ҩ఻తΞϧΰϦζϜͰ 
 Ϛονϯά͕࣌ؒ૿Ճ͢ΔΑ͏ʹ 
 จࣈྻΛੜ੒ ϑΝδϯάͷྲྀΕ
  3. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ൃදऀ ౻࿘ ͷ3F%P4ݕग़ʹର͢Δߩݙ <ϑΝδϯάʹର͢Δվળ> w ੩తղੳʹΑΔҨ఻తΞϧΰϦζϜͷ࠷ॳͷੈ୅ͷܾఆ w

    ܁Γฦ͠ߏ଄Λ࣋ͭจࣈྻΛ࢖ͬͨҨ఻తϓϩάϥϛϯάతΞϓϩʔν w Ҩ఻తϓϩάϥϛϯάతΞϓϩʔνΛԠ༻ͨ͠ܭࢉྔͷ࣍਺ͷਪఆ w ద੾ͳϝϞԽઓུΛ༻͍ͨޮ཰తͳਖ਼نදݱϚονϯά࣮૷ʹΑΔϑΝδϯάͷߴ଎Խ <࢖༻͢ΔΞϧΰϦζϜͷ൑அج४> w ༩͑ΒΕͨਖ਼نදݱʹରͯ͠ɼཧ࿦ʹΑΔݕग़ͱϑΝδϯάʹΑΔݕग़ͷ 
 ͲͪΒ͕࣌ؒɾਫ਼౓తʹద੾͔Λ൑அ͢Δख๏ΛఏҊ <SFDIFDLͷ։ൃ> w ͜ΕΒΛ࣮૷ͨ͠3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃ 
  4. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ લ೥౓ͷൃදͱͷࠩ෼ <ϑΝδϯάʹର͢Δվળ> w ੩తղੳʹΑΔҨ఻తΞϧΰϦζϜͷ࠷ॳͷੈ୅ͷܾఆ w ܁Γฦ͠ߏ଄Λ࣋ͭจࣈྻΛ࢖ͬͨҨ఻తϓϩάϥϛϯάతΞϓϩʔν w

    Ҩ఻తϓϩάϥϛϯάతΞϓϩʔνΛԠ༻ͨ͠ܭࢉྔͷ࣍਺ͷਪఆ w ద੾ͳϝϞԽઓུΛ༻͍ͨޮ཰తͳਖ਼نදݱϚονϯά࣮૷ʹΑΔϑΝδϯάͷߴ଎Խ <࢖༻͢ΔΞϧΰϦζϜͷ൑அج४> w ༩͑ΒΕͨਖ਼نදݱʹରͯ͠ɼཧ࿦ʹΑΔݕग़ͱϑΝδϯάʹΑΔݕग़ͷ 
 ͲͪΒ͕࣌ؒɾਫ਼౓తʹద੾͔Λ൑அ͢Δख๏ΛఏҊ <SFDIFDLͷ։ൃ> w ͜ΕΒΛ࣮૷ͨ͠3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃ 
  5. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ܁Γฦ͠ߏ଄Λ࣋ͭจࣈྻ ఆٛ ্ͷ܁Γฦ͠ߏ଄Λ࣋ͭจࣈྻͱ͸ɼ࣍ͷ੒෼ͷྻͰ͋Δɽ 
 ఆٛ෦෼จࣈྻ ΋͘͠͸ɼ܁Γฦ͠෦෼ 

     ྫ  ΛԿճ͔܁Γฦͨ͋͠ͱʹ ͕͘Δจࣈྻ  ஫܁Γฦ͠෦෼͸ωετ͠ͳ͍ɽ࣮ࡍʹ͸ྻʹΤϯίʔυͯ͠ɼޮ཰తʹ 
 Ҩ఻తΞϧΰϦζϜͷަ伹΍ಥવมҟΛॲཧ͢Δɽ  Ҩ఻తΞϧΰϦζϜͷ֤ݸମ͕୯ͳΔʮ஋ʯͰ͸ͳ͘ɼ 
 ߏ଄Λ࣋ͪύϥϝʔλͰ੍ޚͰ͖Δʮࣜʯʹͳ͍ͬͯΔˠҨ఻తϓϩάϥϛϯά Σ w ∈ Σ* (w)n w ∈ Σ* (aaa)nb aaa b 
  6. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ϑΝδϯάͰͷҨ఻తϓϩάϥϛϯάͷར༻ ϑΝδϯάΛஈ֊ʹ෼͚Δɽ  ୳ࡧϑΣʔζ ߈ܸϑΣʔζ ߈ܸจࣈྻͷީิΛൃݟ খ͞Ίͷᮢ஋ͰϚονϯάΛߦ͍ɼ

    
 ߈ܸจࣈྻͷީิΛ୳ࡧ͢Δɽ ͜ͷͱ͖͸܁Γฦ͠ߏ଄Λ࣋ͭจࣈྻͷ 
 ܁Γฦ͠ճ਺΋ಉ࣌ʹϑΝδϯάͰ 
 ૿Ճ͍ͤͯ͘͞ɽ େ͖Ίͷᮢ஋ͰϚονϯάΛߦ͍ɼ 
 ࣮ࡍʹ߈ܸՄೳ͔ݕূ͢Δɽ ͜ͷͱ͖ͷ܁Γฦ͠ճ਺͸ܭࢉྔ͕ 
 ࢦ਺తɼ ৐తɼ ৐తʜʜɼ৐తͱ 
 ஈʑԼ͍͖͛ͯɼᮢ஋Λӽ͑ͨ৔߹͸ 
 ͦͷܭࢉྔͩͱਪఆ͢Δɽ d d − 1
  7. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ࠓޙͷల๬ <ల๬> w ࣮ݧɾݚڀͱ͍͏ΑΓ͸ɼ࣮ࡍʹ࢖͑ΔϓϩμΫτΛ໨ࢦͯ͠࡞͍ͬͯΔͷͰɼ 
 ϢʔβʔΛ૿΍ͯ͠ɼ3F%P4੬ऑੑ΁ͷରࡦ͕ਐΜͩੈքΛ໨ࢦ͍ͨ͠ɽ <ల๬>

    w ཧ࿦తͳ෼໺΁ͷߩݙͱͯ͠ɼޙํࢀরΛ࣋ͭਖ਼نදݱͷᐆດੑ BNCJHVJUZ 
 ͷܾఆੑʹؔ৺͕͋Δɽ <ల๬> w SFDIFDLͷϑΝδϯάͷεΩʔϜʹ͸Ұൠੑ͕͋ΔΑ͏ʹࢥ͏ͷͰɼ 
 ύϥϝʔλ੍ޚՄೳͳࣜΛҨ఻తϓϩάϥϛϯάͰੜ੒ɼখ͍͞ᮢ஋Ͱ୳ࡧ͠ɼେ͖͍ᮢ஋Ͱݕূ 
 ଞͷ੬ऑੑͷݕग़΍࠷దԽ໰୊ͳͲ΁Ԡ༻͍ͨ͠ɽ 
  8. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ࠓޙͷల๬<ల๬> <ల๬> w ࣮ݧɾݚڀͱ͍͏ΑΓ͸ɼ࣮ࡍʹ࢖͑ΔϓϩμΫτΛ໨ࢦͯ͠࡞͍ͬͯΔͷͰɼ 
 ϢʔβʔΛ૿΍ͯ͠ɼ3F%P4੬ऑੑ΁ͷରࡦ͕ਐΜͩੈքΛ໨ࢦ͍ͨ͠ɽ <ల๬>

    w ཧ࿦తͳ෼໺΁ͷߩݙͱͯ͠ɼޙํࢀরΛ࣋ͭਖ਼نදݱͷᐆດੑ BNCJHVJUZ 
 ͷܾఆੑʹؔ৺͕͋Δɽ <ల๬> w SFDIFDLͷϑΝδϯάͷεΩʔϜʹ͸Ұൠੑ͕͋ΔΑ͏ʹࢥ͏ͷͰɼ 
 ύϥϝʔλ੍ޚՄೳͳࣜΛҨ఻తϓϩάϥϛϯάͰੜ੒ɼখ͍͞ᮢ஋Ͱ୳ࡧ͠ɼେ͖͍ᮢ஋Ͱݕূ 
 ଞͷ੬ऑੑͷݕग़΍࠷దԽ໰୊ͳͲ΁Ԡ༻͍ͨ͠ɽ 
  9. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ SFDIFDLΛ޿Ί͍ͨ w &4-JOUϓϥάΠϯͱͯ͠ར༻Ͱ͖ΔΑ͏ʹ͍ͯ͠Δ w ͦͦ͜͜େ͖ͳϓϩδΣΫτ LVCFBQQTLVCFBQQTˑ Ͱར༻

    w Ή͠Ζͦ͜Ͱ͔͠࢖ΘΕ͍ͯͳ͍͚ΕͲʝʝ w 74$PEF֦ு΋ϢʔβʔʹΑͬͯ࡞ΒΕͨ 3BOSFEPTDIFDLFSGPSWTDPEF  w ͋Γ͕ͱ͏͍͟͝·͢ w ͔͠͠ɼ·ͩ·ͩ޿·͍ͬͯΔͱ͸ݴ͍೉͍ঢ়گɽ 
  10. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ࠓޙͷల๬<ల๬> <ల๬> w ࣮ݧɾݚڀͱ͍͏ΑΓ͸ɼ࣮ࡍʹ࢖͑ΔϓϩμΫτΛ໨ࢦͯ͠࡞͍ͬͯΔͷͰɼ 
 ϢʔβʔΛ૿΍ͯ͠ɼ3F%P4੬ऑੑ΁ͷରࡦ͕ਐΜͩੈքΛ໨ࢦ͍ͨ͠ɽ <ల๬>

    w ཧ࿦తͳ෼໺΁ͷߩݙͱͯ͠ɼޙํࢀরΛ࣋ͭਖ਼نදݱͷᐆດੑ BNCJHVJUZ 
 ͷܾఆੑʹؔ৺͕͋Δɽ <ల๬> w SFDIFDLͷϑΝδϯάͷεΩʔϜʹ͸Ұൠੑ͕͋ΔΑ͏ʹࢥ͏ͷͰɼ 
 ύϥϝʔλ੍ޚՄೳͳࣜΛҨ఻తϓϩάϥϛϯάͰੜ੒ɼখ͍͞ᮢ஋Ͱ୳ࡧ͠ɼେ͖͍ᮢ஋Ͱݕূ 
 ଞͷ੬ऑੑͷݕग़΍࠷దԽ໰୊ͳͲ΁Ԡ༻͍ͨ͠ɽ 
  11. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ޙํࢀরΛ࣋ͭਖ਼نදݱ ޙํࢀরΛ࣋ͭਖ਼نදݱ FYUFOEFESFHVMBSFYQSFTTJPO SFHFY ͸ 
 ༷ʑͳܾఆ໰୊ʹ͍ܾͭͯఆෆೳͰ͋Δ͜ͱ͕஌ΒΕ͍ͯΔ<'SFZEFOCFSHFS

    50$4>ɽ ීวੑ VOJWFSTBMJUZ ɾਖ਼نੑ SFHVMBSJUZ ɾแؚ JODMVTJPO ɾ౳Ձੑ FRVJWBMFODF  ͕ͩɼ3F%P4ͱؔ܎ͷͭΑ͍ᐆດੑ BNCJHVJUZ ͷܾఆՄೳੑʹ͍ͭͯ͸ 
 ൃදऀͷ஌ΔݶΓະղܾͰ͋Δ ᐆດੑಉ͡จࣈྻʹର͢Δಋग़໦͕ෳ਺ଘࡏ͢Δ ɽ ޙํࢀরʹՃ͑ͯઌಡΈΛ࣋ͭ৔߹ͳΒܾఆෆೳͱূ໌Ͱ͖ͦ͏͕ͩɼ 
 ઌಡΈ͕ແ͍৔߹͸Ͳ͏ͩΖ͏͔ʁ 
  12. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ࠓޙͷల๬<ల๬> <ల๬> w ࣮ݧɾݚڀͱ͍͏ΑΓ͸ɼ࣮ࡍʹ࢖͑ΔϓϩμΫτΛ໨ࢦͯ͠࡞͍ͬͯΔͷͰɼ 
 ϢʔβʔΛ૿΍ͯ͠ɼ3F%P4੬ऑੑ΁ͷରࡦ͕ਐΜͩੈքΛ໨ࢦ͍ͨ͠ɽ <ల๬>

    w ཧ࿦తͳ෼໺΁ͷߩݙͱͯ͠ɼޙํࢀরΛ࣋ͭਖ਼نදݱͷᐆດੑ BNCJHVJUZ 
 ͷܾఆੑʹؔ৺͕͋Δɽ <ల๬> w SFDIFDLͷϑΝδϯάͷεΩʔϜʹ͸Ұൠੑ͕͋ΔΑ͏ʹࢥ͏ͷͰɼ 
 ύϥϝʔλ੍ޚՄೳͳࣜΛҨ఻తϓϩάϥϛϯάͰੜ੒ɼখ͍͞ᮢ஋Ͱ୳ࡧ͠ɼେ͖͍ᮢ஋Ͱݕূ 
 ଞͷ੬ऑੑͷݕग़΍࠷దԽ໰୊ͳͲ΁Ԡ༻͍ͨ͠ɽ 
  13. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ࢀߟจݙϦετ w <%BWJT 41> 
 %"7*4 +BNFT$4&37"/5

    'SBODJTDP-&& %POHZPPO6TJOHTFMFDUJWF NFNPJ[BUJPOUPEFGFBUSFHVMBSFYQSFTTJPOEFOJBMPGTFSWJDF 3F%P4  *O*&&&4ZNQPTJVNPO4FDVSJUZBOE1SJWBDZ 41 -PT"MBNJUPT $"  64"Q w <'SFZEFOCFSHFS 50$4> 
 '3&:%&/#&3(&3 %PNJOJL%&YUFOEFESFHVMBSFYQSFTTJPOT4VDDJODUOFTT BOEEFDJEBCJMJUZ5IFPSZPG$PNQVUJOH4ZTUFNT   
  14. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ࢀߟจݙϦετ w <-J 64&/*94FDVSJUZ> 
 -* :FUJOH

    FUBM3F%P4)VOUFS"$PNCJOFE4UBUJDBOE%ZOBNJD"QQSPBDI GPS3FHVMBS&YQSFTTJPO\%P4^%FUFDUJPO*OUI64&/*94FDVSJUZ 4ZNQPTJVN 64&/*94FDVSJUZ Q w <4IFO "4&> 
 4)&/ :VKV FUBM3F4DVFDSBGUJOHSFHVMBSFYQSFTTJPO%P4BUUBDLT*O SE*&&&"$.*OUFSOBUJPOBM$POGFSFODFPO"VUPNBUFE4PGUXBSF &OHJOFFSJOH "4& *&&& Q 
  15. ୈճϓϩάϥϛϯάɾγϯϙδ΢Ϝ೥݄೔ ౔ ʮ3F%P4ݕग़ϓϩάϥϜSFDIFDLͷ։ൃʯ೔ຊେֶจཧֶ෦৘ใՊֶՊ೥౻࿘େ໻ ࢀߟจݙϦετ w <8FJEFNBO 1I%5IFTJT> 
 8&*%&."/ /JDPMBBT)FOESJL4UBUJDBOBMZTJTPGSFHVMBSFYQSFTTJPOT

    1I%5IFTJT4UFMMFOCPTDI4UFMMFOCPTDI6OJWFSTJUZ w <8ÛTUIPM[ 5"$"4> 
 8¾45)0-; 7BMFOUJO FUBM4UBUJDEFUFDUJPOPG%P4WVMOFSBCJMJUJFTJO QSPHSBNTUIBUVTFSFHVMBSFYQSFTTJPOT*O*OUFSOBUJPOBM$POGFSFODFPO 5PPMTBOE"MHPSJUINTGPSUIF$POTUSVDUJPOBOE"OBMZTJTPG4ZTUFNT 4QSJOHFS #FSMJO )FJEFMCFSH Q