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

ReDoS 検出の最先端 recheck の紹介 / State of the Art of ReDoS Detection

ReDoS 検出の最先端 recheck の紹介 / State of the Art of ReDoS Detection

TSUYUSATO Kitsune

March 04, 2022
Tweet

More Decks by TSUYUSATO Kitsune

Other Decks in Programming

Transcript

  1. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ 
 Ӊ஦ϠόΠɻ 
 ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ 
 ޿͍ͱ͔ͬͯ΋ 
 ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ 


    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ 
 Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ 
 ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ 
 ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ ͬ͠ΐɻ 
 ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ 
 ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ 
 ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό ͗͢ɻ 
 ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ 
 ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ 
 ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ 
 ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ 
 ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ 
 ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ 
 ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢ ͷʹɺ 
 Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ 
 ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ 
 ͜ͷίϐϖΛɺ
  2. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ 
 Ӊ஦ϠόΠɻ 
 ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ 
 ޿͍ͱ͔ͬͯ΋ 
 ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ 


    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ 
 Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ 
 ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ 
 ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ ͬ͠ΐɻ 
 ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ 
 ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ 
 ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό ͗͢ɻ 
 ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ 
 ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ 
 ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ 
 ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ 
 ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ 
 ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ 
 ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢ ͷʹɺ 
 Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ 
 ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ 
 ͜ͷਖ਼نදݱͰϚονϯά͢Δͱɺ /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/
  3. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ 
 Ӊ஦ϠόΠɻ 
 ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ 
 ޿͍ͱ͔ͬͯ΋ 
 ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ 


    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ 
 Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ 
 ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ 
 ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ ͬ͠ΐɻ 
 ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ 
 ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ 
 ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό ͗͢ɻ 
 ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ 
 ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ 
 ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ 
 ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ 
 ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ 
 ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ 
 ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢ ͷʹɺ 
 Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ 
 ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ 
 /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/ ໿ඵ͔͔Δɻ ˞.BD#PPL1SP J ্Ͱ/PEF KTͰ࣮ߦͨ݁͠Ռ
  4. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ 
 Ӊ஦ϠόΠɻ 
 ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ 
 ޿͍ͱ͔ͬͯ΋ 
 ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ 


    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ 
 Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ 
 ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ 
 ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ ͬ͠ΐɻ 
 ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ 
 ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ 
 ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό ͗͢ɻ 
 ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ 
 ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ 
 ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ 
 ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ 
 ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ 
 ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ 
 ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢ ͷʹɺ 
 Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ 
 ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ 
 /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/ จࣈͰඵ͔͔Δͷ͸ϠόΠɻ
  5. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ 
 Ӊ஦ϠόΠɻ 
 ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ 
 ޿͍ͱ͔ͬͯ΋ 
 ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ 


    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ 
 Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ 
 ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ 
 ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ ͬ͠ΐɻ 
 ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ 
 ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ 
 ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό ͗͢ɻ 
 ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ 
 ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ 
 ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ 
 ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ 
 ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ 
 ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ 
 ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢ ͷʹɺ 
 Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ 
 ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ 
 /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/ ݱ୅ͷ$16͕ɺ ඵͰจࣈఔ౓ॲཧͰ͖ͳ͍Θ͚͕ͳ͍ɻ
  6. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ 
 Ӊ஦ϠόΠɻ 
 ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ 
 ޿͍ͱ͔ͬͯ΋ 
 ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ 


    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ 
 Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ 
 ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ 
 ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ ͬ͠ΐɻ 
 ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ 
 ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ 
 ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό ͗͢ɻ 
 ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ 
 ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ 
 ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ 
 ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ 
 ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ 
 ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ 
 ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢ ͷʹɺ 
 Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ 
 ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ 
 /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/ ͡Ό͋Կ͕ѱ͍ʁ
  7. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ 
 Ӊ஦ϠόΠɻ 
 ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ 
 ޿͍ͱ͔ͬͯ΋ 
 ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ 


    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ 
 Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ 
 ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ 
 ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ ͬ͠ΐɻ 
 ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ 
 ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ 
 ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό ͗͢ɻ 
 ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ 
 ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ 
 ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ 
 ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ 
 ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ 
 ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ 
 ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢ ͷʹɺ 
 Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ 
 ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ 
 /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/ ਖ਼نදݱͷϚονϯά࣌ؒͷരൃɺ
  8. ϠόΠɻӉ஦ϠόΠɻ·͡ͰϠόΠΑɺϚδϠόΠɻ 
 Ӊ஦ϠόΠɻ 
 ·ͣ޿͍ɻ΋͏޿͍ͳΜͯ΋Μ͡Όͳ͍ɻ௒޿͍ɻ 
 ޿͍ͱ͔ͬͯ΋ 
 ʮ౦ژυʔϜݸͿΜ͘Β͍ʁʯ 


    ͱ͔ɺ΋͏ɺͦ͏͍͏Ϩϕϧ͡Όͳ͍ɻ 
 Կ͠ΖແݶɻεήΣʂͳΜ͔୯Ґͱ͔ແ͍ͷɻԿ௶ͱ͔Կᶨͱ͔Λ௒ӽͯ͠Δɻແݶͩ͠௒޿͍ɻ 
 ͔͠΋๲ுͯ͠ΔΒ͍͠ɻϠόΠΑɺ๲ுͩΑɻ 
 ͩͬͯී௨͸஍ٿͱ͔๲ு͠ͳ͍͡ΌΜɻͩͬͯࣗ෼ͷ෦԰ͷ࿓Լ͕ͩΜͩΜ৳ͼͯͬͨΒࠔΔ͡ΌΜɻτΠϨͱ͔௒ԕ͍ͱ͔ࠔΔ ͬ͠ΐɻ 
 ௨ֶ࿏͕৳ͼͯɺҰ೥ͷͱ͖͸ెา෼ͩͬͨͷʹɺࡾ೥ͷͱ͖͸ࣗసंͰೋ࣌ؒͱ͔ٽͬ͘͠ΐɻ 
 ͔ͩΒ஍ٿͱ͔๲ு͠ͳ͍ɻ࿩ͷΘ͔ΔϠπͩɻ 
 ͚ͲӉ஦͸ϠόΠɻͦΜͳͷؾʹ͠ͳ͍ɻ๲ு͠·͘Γɻ࠷΋ԕ͔͘Β౸ୡ͢Δޫͱ͔؍ଌͯ͠΋Α͘Θ͔Μͳ͍͘Β͍ԕ͍ɻϠό ͗͢ɻ 
 ແݶ͍͚ͬͯͨͲɺ΋͔ͨ͠͠Β༗ݶ͔΋͠Μͳ͍ɻͰ΋༗ݶͬͯࣄʹ͢Δͱ 
 ʮ͡Ό͋ɺӉ஦ͷ୺ͷ֎ଆͬͯφχΑʁʯ 
 ͬͯࣄʹͳΔ͠ɺͦΕ͸୭΋Θ͔Βͳ͍ɻϠόΠɻ୭ʹ΋෼͔Βͳ͍ͳΜͯੌ͗͢Δɻ 
 ͋ͱ௒פ͍ɻ໿έϧϏϯɻઁࢯͰݴ͏ͱʵˆɻϠόΠɻפ͗͢ɻόφφͰఝଧͭՋ΋ͳ͘ࢮ͵ɻා͍ɻ 
 ͦΕʹ௒Կ΋ແ͍ɻ௒ΨϥΨϥɻͦΕʹ௒ͷΜͼΓɻԯ೥ͱ͔ฏؾͰग़ͯ͘Δɻԯ೥ͯɻখֶੜͰ΋ݴΘͶ͐Αɺ࠷ۙɻ 
 ͳΜͭͬͯ΋Ӊ஦͸അྗ͕ੌ͍ɻແݶͱ͔ฏؾͩ͠ɻ 
 ͏ͪΒͳΜͯແݶͱ͔͔͔ͨͩੵ෼ܭࢉͰग़͖͚ͯͨͩͰ্ख͘ѻ͑ͳ͍͔Β༗ݶʹͨ͠ΓɺGͱஔ͍ͯΈͨΓɺԋࢉࢠ࢖ͬͨΓ͢ ͷʹɺ 
 Ӊ஦͸શવฏؾɻແݶΛແݶͷ··ѻͬͯΔɻੌ͍ɻϠόΠɻ 
 ͱʹ͔͘و༷ΒɺӉ஦ͷϠό͞Λ΋ͬͱ஌Δ΂͖ͩͱࢥ͍·͢ɻ 
 /^.+(Ӊ஦|ϠόΠ|[\s\S])*.+$/ ͜Ε͕3F%P4ɻ
  9. ਖ਼نදݱͷരൃͷ࢓ํ͸छྨ͋Δ จࣈྻͷ௕͞ ʹରͯ͠Ϛονϯά࣌ؒͷ࠷ѱܭࢉྔ͕ɺ ʹͳΔ ࢦ਺తͳ ৔߹ 
 ɹྫ/^(fizz|buzz|fizzbuzz)*$/ ߈ܸจࣈྻ('fizzbuzz' x

    27) . 'x' 
 ɹจࣈҎԼͰ߈ܸͰ͖ΔͨΊͱͯ΋ϠόΠɻ ʹͳΔ ৐తͳ ৔߹ 
 ɹྫ/^<[^<]*@[^>]*>$/ ߈ܸจࣈྻ'<' . ('@' x 54773) 
 ɹ߈ܸʹ͸਺ઍʙ਺ສจࣈඞཁͳͨΊɺۓٸ౓͸௿Ίɻ 
 ɹ͔͠͠ɺ4UBDL0WFS fl PX΍$MPVE fl BSF͕࣮ࡍʹ3F%P4Ͱμ΢ϯͨ͠ͷ͸͜ͷέʔεɻ n O(2n) O(n2) 
  10. ʹͳΔ ࢦ਺తͳ ৔߹ͷಛ௃ O(2n) ܁Γฦ͠ͷதͷϚονϯάͷ࢓ํ͕ᐆດ ྫ͑͹/^(fizz|buzz|fizzbuzz)*$/ͷ৔߹ɺ 
 "fizzbuzz"ͷϚονϯάͷ࢓ํ͕ɺ 
 1."fizzbuzz"ͱ2."fizzbuzz"ͷ௨Γ͋Δɻ

    "fizzbuzz"͕OݸฒΜͰ͍ͯ࠷ޙͰόοΫτϥοΫ͢Δͱɺ 
 ྆ํͷ௨ΓํΛͦΕͧΕʹରͯ͠ࢼ͞ͳ͚Ε͹͍͚ͳ͍ͨΊɺ 
 ࢦ਺తͳ ͷܭࢉྔʹͳΔɻ O(2n) 
  11. ʹͳΔ ৐తͳ ৔߹ͷಛ௃ O(n2) ͭͷ܁Γฦ͠ͱͦͷؒͷϚονϯάͷ࢓ํ͕ᐆດ ྫ͑͹/^<[^<]*@[^>]*>$/ͷ৔߹ɺ 
 "@"ͷจࣈͰ[^<]*ͱ[^>]*Λ܁Γฦ͢ͷͱ 
 @Ͱ܁Γฦ͠ΛҠಈ͢Δ͜ͱ͕Ͱ͖Δɻ

    "@"͕OݸฒΜͰ͍ͯ࠷ޙͰόοΫτϥοΫ͢Δͱɺ 
 Ͳ͜Ͱࠨ͔Βӈͷ܁Γฦ͠ʹҠಈ͢Δ͔͕ᐆດʹͳΔͨΊɺ 
 ৐తͳ ͷܭࢉྔʹͳΔɻ O(n2) 
  12. ʹͳΔ ࢦ਺తͳ ৔߹ͷಛ௃ O(2n) &%" &YQPOFOUJBM%FHSFF"NCJHVJUZ ߏ଄ q fizz buzz

    fizzbuzz q w w ͋Δจࣈྻ Ͱ͋Δঢ়ଶ ʹ 
 ໭ͬͯ͘Δํ๏͕௨Γ͋Δ w q q fizzbuzz fizzbuzz ੔ཧ 
  13. ʹͳΔ ৐తͳ ৔߹ͷಛ௃ O(n2) *%" *O fi OJUF%FHSFF"NCJHVJUZ ߏ଄ q1

    q2 [^<] [^>] @ q1 q2 w ಉ͡จࣈྻ Ͱঢ়ଶ ʹ໭ͬͯ͜Εͯɺ 
 ͦͷؒ΋ભҠͰ͖Δɻ w q1 , q2 w w 
  14. &%"ߏ଄ɾ*%"ߏ଄ͷ୳ࡧΞϧΰϦζϜ ΦʔτϚτϯͷੵߏ੒ͷΑ͏ʹͯ͠ঢ়ଶΛ૊ʹͨ͠ΦʔτϚτϯΛߏ੒͢Δɻ 
 ͷͱ͖ʹ  ͜ͷભҠؔ਺Λڧ࿈݁੒෼෼ղͯ͠ɺ 
 ಉ͡ڧ࿈݁੒෼ʹ ͱ 

    ͨͩ͠ ͷΑ͏ͳ 
 ঢ়ଶͷ૊͕͋Ε͹&%"ߏ଄͕ଘࡏ͢Δɻ *%"ߏ଄ͷ৔߹͸ɺঢ়ଶΛͭ૊ʹͯ͠ 
 ͱ ͷΑ͏ͳ૊Λ୳͢͜ͱͰൃݟͰ͖Δɻ q11 a q12 ∧ q21 a q22 (q11 , q21 ) a (q12 , q22 ) (q1 , q1 ) (q2 , q3 ) q2 ≠ q3 (q1 , q1 , q2 ) (q1 , q2 , q2 ) 
  15. Ҩ఻తΞϧΰϦζϜ 
 Ϛονϯάʹ࣌ؒͷ͔͔ΔจࣈྻΛֻ͚߹Θͤͯɺ 
 ΑΓ࣌ؒͷ͔͔ΔจࣈྻΛੜ੒͢Δ Ҩ఻తΞϧΰϦζϜͰ 
 Ϛονϯά࣌ؒΛ૿Ճͤ͞Δ "foo" "bar"

    "foobar" ͨ͘͞Μͷจࣈྻ ਖ਼نදݱ 
 ࣮૷ ೖྗ Ϛονϯά͕࣌ؒ രൃ͢Δ΋ͷΛൃݟ 3F%P4੬ऑ 
 ͱͯ͠ݕग़ 
  16. จࣈྻͷ܁Γฦ͠ߏ଄ Ϛονϯά࣌ؒΛരൃͤ͞Δจࣈྻ͸෦෼తʹ܁Γฦ͍ͯ͠Δɻ 
 ྫ('fizzbuzz' x 27) . 'x' '<' .

    ('@' x 54773)  ੜ੒͞ΕΔจࣈྻʹ࣍ͷ จࣈΛ܁Γฦ͢ͱ͍͏ҙຯͷه߸ Λ௥Ճͯ͠ɺ 
 ͦΕΛؚΊͯϑΝδϯάΛߦ͏ɻ ͜ΕʹΑͬͯɺ৐తͳ৔߹Ͱ΋ϑΝδϯάʹΑͬͯݕग़͕ՄೳʹͳΔɻ n □ n 
  17. ࢖͍ํ ී௨ʹϥΠϒϥϦͱͯ͠࢖͑Δɻ const { check } = require('recheck'); 
 console.log(await

    check('^(a|a)*$', '')); &4-JOUͷϓϥάΠϯ eslint-plugin-redos ΋ެ։͍ͯ͠ΔͷͰɺ 
 &4-JOUΛ࢖͍ͬͯΔϓϩδΣΫτʹ͙͢ʹಋೖՄೳɻ 
  18. ൃදͷ·ͱΊ w 3F%P4ݕग़͸਺ֶతʹఆࣜԽͰ͖Δղ͚Δ໰୊ɻ 
 ͳΜ͔;Θͬͱͨ͠ؾ෼Ͱܭࢉྔ͕രൃ͢ΔΘ͚Ͱ͸ͳ͍ɻ w ͱ͸͍͑ݱ࣮ͷਖ਼نදݱΛର৅ʹ͢Δͱ໰୊͕͋ΔͷͰɺ 
 ϑΝδϯάͳͲΛซ༻͢Δͷ͕࠷ઌ୺ͷ3F%P4ݕग़ɻ w

    3F%P4ݕग़ϥΠϒϥϦͱͯ͠SFDIFDL͕͋Δɻ࢖ͬͯ΍͍ͬͯͩ͘͞ɻ w ͱ͸͍͑׬શʹਖ਼֬ͳ3F%P4ݕग़Λݱ࣮తͳ࣌ؒͰߦ͏ͷ͸ 
 ΄ͱΜͲෆՄೳͳͷͰɺݕग़݁Ռ͚ͩΛݟͯ҆શͩͱ൑அͤͣɺ 
 λΠϜΞ΢τͳͲΛೖΕΔ΋ͷॏཁɻ