‫ﺑﺮرﺳﯽ روﺷﻬﺎي ﺟﻠﻮﮔﯿﺮي از‬
‫ﮐﺎرﮐﺮد اﮐﺴﭙﻠﻮﯾﺖ ﻫﺎ در ﻟﯿﻨﻮﮐﺲ‬


         ‫ﻗﺴﻤﺖ ﯾﮑﻢ – ‪ASLR‬‬



             ‫ﻣﺤﻤﺪ ﮔﻠﯿﺎﻧﯽ‬
             ‫ﺧﺮداد 0931‬
‫ﻓﻬﺮﺳﺖ ﻣﻄﺎﻟﺐ‬



‫ﻧﺤﻮه ﭘﯿﺎده ﺳﺎزي‪ ASLR‬در ﭘﺸﺘﻪ‬   ‫-‬                          ‫‪ ASLR‬ﭼﯿﺴﺖ؟‬       ‫-‬


       ‫ﺑﺮرﺳﯽ ‪ ASLR‬در ‪Heap‬‬     ‫-‬                       ‫ﻗﺒﻞ و ﺑﻌﺪ از ‪ASLR‬‬   ‫-‬


     ‫ﺑﺮرﺳﯽ ‪ ASLR‬در ‪mmap‬‬       ‫-‬                 ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬    ‫-‬


                  ‫ﺟﻤﻊ ﺑﻨﺪي‬    ‫-‬     ‫ﺑﺮرﺳﯽ ﺳﻮرس ﻓﺎﯾﻠﻬﺎي ‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ‬     ‫-‬
‫‪ASLR‬‬

‫‪ ASLR‬ﯾﺎ ﺗﺼﺎدﻓﯽ ﺳﺎزي ﻓﻀﺎي آدرس، روﺷﯽ اﺳﺖ ﮐﻪ در آن، ﻓﻀﺎﻫﺎي ﮐﻠﯿﺪي ﺑﺮﻧﺎﻣﻪ از ﺣﺎﻟﺖ‬          ‫-‬
                          ‫ﺛﺎﺑﺖ و از ﭘﯿﺶ ﺗﻌﯿﯿﻦ ﺷﺪه، ﺑﻪ ﺣﺎﻟﺖ ﺗﺼﺎدﻓﯽ ﺗﻐﯿﯿﺮ ﭘﯿﺪا ﻣﯽ ﮐﻨﺪ.‬
‫ﺑﺎ وﺟﻮد ‪ ،ASLR‬ﻧﻔﻮذﮔﺮ ﻗﺎدر ﺑﻪ ﺗﻌﯿﯿﻦ آدرس ﺑﺮﮔﺸﺖ ﻣﻨﺎﺳﺐ )ﮐﻪ ﺑﻪ ﮐﺪ‪ ‬دﻟﺨﻮاه او اﺷﺎره ﮐﻨﺪ(،‬   ‫-‬
                                                                         ‫ﻧﺨﻮاﻫﺪ ﺑﻮد.‬
‫‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ از ﻧﺴﺨﮥ 21.6.2 )5002 ‪ (May‬ﺑﻪ ﺻﻮرت ﭘﯿﺶ ﻓﺮض در ﺣﺪ ﺿﻌﯿﻔﯽ‬                   ‫-‬
                                                                  ‫ﻗﺮار داده ﺷﺪه اﺳﺖ.‬
   ‫‪ PaX‬و ‪ ،exec-shield‬ﭘﯿﺎده ﺳﺎزي ﻫﺎي ﻗﻮي ﺗﺮي از اﯾﻦ روش در ﻟﯿﻨﻮﮐﺲ اراﺋﻪ ﮐﺮده اﻧﺪ.‬      ‫-‬
‫اﮔﺮﭼﻪ اﯾﻦ ﺗﮑﻨﯿﮏ در ﮐﺮﻧﻞ ﻟﯿﻨﻮﮐﺲ از ﺳﺎل 5002 ﺑﻪ ﺻﻮرت ﭘﯿﺶ ﻓﺮض ﻗﺮار ﮔﺮﻓﺖ وﻟﯽ‬               ‫-‬
                ‫‪ ،PaX‬در ﺳﺎل 1002 ﯾﮏ ﭘﯿﺎده ﺳﺎزي ﮐﺎﻣﻞ از اﯾﻦ ﺗﮑﻨﯿﮏ را اراﺋﻪ ﮐﺮده ﺑﻮد.‬
‫ﻗﺒﻞ از ‪ASLR‬‬
‫ﺑﺪون اﺳﺘﻔﺎده از ﺗﮑﻨﯿﮏ ‪ ،ASLR‬آدرس ﺷﺮوع ﭘﺸﺘﻪ از ﻗﺒﻞ ﻣﺸﺨﺺ ﺑﻮده و ﺑﻨﺎﺑﺮاﯾﻦ ﻣﯽ ﺗﻮان‬                             ‫-‬
                                                                        ‫آدرس ﻗﺮارﮔﯿﺮي ﺷﻠﮑﺪ را ﺑﺪﺳﺖ آورد.‬
          ‫در اﯾﻦ ﺣﺎﻟﺖ، ﺗﻨﻬﺎ ﮐﺎﻓﯽ اﺳﺖ آدرس ﺷﺮوع ﺷﻠﮑﺪ را ﺑﺮ روي ‪ EIP‬ﺑﺎزﻧﻮﯾﺴﯽ ﻧﻤﺎﯾﯿﻢ:‬                         ‫-‬
                        ‫آدرس ﺷﻠﮑﺪ‬

                                    ‫آدرس ﺷﻠﮑﺪ‬

                                                ‫آدرس ﺷﻠﮑﺪ‬

                                                            ‫آدرس ﺷﻠﮑﺪ‬

                                                                          ‫آدرس ﺷﻠﮑﺪ‬

                                                                                      ‫آدرس ﺷﻠﮑﺪ‬
            ‫ﺑﺎﻓﺮ آﺳﯿﺐ‬                                                                  ‫‪IP‬‬
             ‫ﺷﻠﮑﺪ‬                      ‫ﻓﻀﺎي ﺣﺎﻓﻈﻪ‬
             ‫ﭘﺬﯾﺮ‬                                                                     ‫)‪(EIP‬‬




                                                     ‫ﺳـــــﺮرﯾــــــــﺰ‬
                ‫ﺳﺎﯾﺰ واﻗﻌﯽ ﺑﺎﻓﺮ‬
‫ﻗﺒﻞ از ‪ASLR‬‬
‫وﺿﻌﯿﺖ ﻓﻀﺎي آدرس ﯾﮏ ﺑﺮﻧﺎﻣﻪ )‪ (cat‬در دو ﺑﺎر اﺟﺮاي ﻣﺨﺘﻠﻒ ﻗﺒﻞ از ﻓﻌﺎل ﺳﺎزي ‪ ASLR‬ﺑﻪ‬   ‫-‬
                                                             ‫ﺻﻮرت زﯾﺮ ﻣﯽ ﺑﺎﺷﺪ:‬
‫ﻗﺒﻞ از ‪ASLR‬‬
‫ﻗﺒﻞ از ‪ASLR‬‬

                       ‫- وﺿﻌﯿﺖ آدرس ﻫﺎ در دو اﺟﺮا از ﻗﺮار زﯾﺮ اﺳﺖ:‬


  ‫اﺠﺮای دوم‬                  ‫اﺠﺮای ﮑﻢ‬           ‫ﻤﮑﺎن ﺣﺎﻓﻈﻪ‬
‫000‪0x0804e‬‬                ‫000‪0x0804e‬‬              ‫‪HEAP‬‬
‫000‪0xbffea‬‬                 ‫000‪0xbffea‬‬             ‫‪Stack‬‬
‫00076‪0x00b‬‬                ‫00076‪0x00b‬‬               ‫‪Libc‬‬
‫00084080‪0x‬‬                ‫00084080‪0x‬‬            ‫ﺧﻮد ِ ﻓﺎ ﻞ اﺠﺮا ـ‬



              ‫آدرس ﻫﺎ در ﻫﺮ دو اﺟﺮا ﯾﮑﺴﺎن اﺳﺖ‬
‫ﺑﻌﺪ از ‪ASLR‬‬

    ‫- ﺑﺎ اﺳﺘﻔﺎده از ‪ ،ASLR‬آدرس ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ، از ﻗﺒﻞ ﻧﺎﻣﺸﺨﺺ ﺧﻮاﻫﺪ ﺑﻮد.‬
‫- ﺑﻪ دﻟﯿﻞ ﺗﺼﺎدﻓﯽ ﺑﻮدن ﻣﺤﻞ ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ، ﻧﻤﯽ ﺗﻮان آدرس ﺷﻠﮑﺪ را ﺑﻪ‬
                                                                                                                      ‫ﻫﻨﮕﺎم ﺑﺎرﮔﺰاري ﺑﺪﺳﺖ آورد.‬
                                     ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬


                                                            ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬


                                                                                   ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬


                                                                                                          ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬


                                                                                                                                 ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬


                                                                                                                                                         ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬
                         ‫ﺑﺎﻓﺮ آﺳﯿﺐ‬                                                                                                                       ‫‪IP‬‬
                          ‫ﺷﻠﮑﺪ‬                                   ‫ﻓﻀﺎي ﺣﺎﻓﻈﻪ‬
                          ‫ﭘﺬﯾﺮ‬                                                                                                                          ‫)‪(EIP‬‬




                                             ‫ﺑﺎ وﺟﻮد ﺳﺮرﯾﺰ، ﺑﻪ دﻟﯿﻞ ﻣﺸﺨﺺ‬
            ‫)????????(‬




                             ‫ﻧﺒﻮدن آدرس ﺷﻠﮑﺪ، ﻧﻤﯽ ﺗﻮان ﺳﺎﯾﺰ واﻗﻌﯽ ﺑﺎﻓﺮ‬
                                             ‫ﮐﻨﺘﺮل اﺟﺮا را ﺑﻪ آن اﻧﺘﻘﺎل داد‬
‫ﺑﻌﺪ از ‪ASLR‬‬
‫وﺿﻌﯿﺖ ﻓﻀﺎي آدرس ﯾﮏ ﺑﺮﻧﺎﻣﻪ )‪ (cat‬در دو ﺑﺎر اﺟﺮاي ﻣﺨﺘﻠﻒ ﺑﻌﺪ از ﻓﻌﺎل ﺳﺎزي ‪ ASLR‬ﺑﻪ‬   ‫-‬
                                                             ‫ﺻﻮرت زﯾﺮ ﻣﯽ ﺑﺎﺷﺪ:‬
‫ﺑﻌﺪ از ‪ASLR‬‬
‫ﻗﺒﻞ از ‪ASLR‬‬
                             ‫وﺿﻌﯿﺖ آدرس ﻫﺎ در دو اﺟﺮا از ﻗﺮار زﯾﺮ اﺳﺖ:‬   ‫-‬


  ‫اﺠﺮای دوم‬               ‫اﺠﺮای ﮑﻢ‬                ‫ﻤﮑﺎن ﺣﺎﻓﻈﻪ‬
‫00060680‪0x‬‬             ‫0000‪0x08dd‬‬                   ‫‪HEAP‬‬
‫00061‪0xbfe‬‬             ‫000828‪0xbf‬‬                   ‫‪Stack‬‬
‫00076‪0x00b‬‬             ‫00076‪0x00b‬‬                    ‫‪Libc‬‬
‫00084080‪0x‬‬             ‫00084080‪0x‬‬                 ‫ﺧﻮد ِ ﻓﺎ ﻞ اﺠﺮا ـ‬




         ‫آدرس ‪ HEAP‬و ‪ STACK‬در ﻫﺮ اﺟﺮا ﻣﺘﻔﺎوت‬
                          ‫اﺳﺖ.‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬

            ‫‪ ،ASLR‬ﻣﮑﺎن ﻫﺎي ﻣﺨﺘﻠﻒ ﻗﺮار ﮔﯿﺮي ﯾﮏ ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ را ﺗﺼﺎدﻓﯽ ﻣﯽ ﻧﻤﺎﯾﺪ.‬          ‫-‬

 ‫ﺑﺎ ﻫﺮ ﺑﺎر اﺟﺮاي ﺑﺮﻧﺎﻣﻪ، آدرس اﯾﻦ ﻣﮑﺎن ﻫﺎي ﺣﺎﻓﻈﻪ ﻧﺴﺒﺖ ﺑﻪ اﺟﺮاي ﻗﺒﻠﯽ ﻣﺘﻔﺎوت ﺧﻮاﻫﺪ ﺑﻮد.‬      ‫-‬


                             ‫‪ ،ASLR‬در ﻟﯿﻨﻮﮐﺲ از ﻧﺴﺨﮥ 21.6.2 درون ﮐﺮﻧﻞ ﻗﺮار داده ﺷﺪ.‬        ‫-‬


                ‫ﻗﺒﻞ از 5002 )21.6.2(، ‪ ASLR‬ﺗﻮﺳﻂ ‪ PaX‬در ﺳﺎل 1002 ﻣﻌﺮﻓﯽ ﺷﺪه ﺑﻮد.‬             ‫-‬


‫‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ ﻋﻤﻠﯿﺎت ﺗﺼﺎدﻓﯽ ﺳﺎزي را ﺑﺮروي ﺑﺎﯾﻨﺮي ﻫﺎي ‪ ELF‬اﻧﺠﺎم ﻣﯽ دﻫﺪ. ﺑﻨﺎﺑﺮاﯾﻦ‬           ‫-‬


          ‫ﻣﯽ ﺗﻮان اﯾﻦ ﭘﯿﺎده ﺳﺎزي را در ﺗﻮاﺑﻊِ ﮐﺘﺎﺑﺨﺎﻧﻪ اي ‪) ELF‬و ﺳﺎﯾﺮ ﺗﻮاﺑﻊ( ﺟﺴﺘﺠﻮ ﻧﻤﻮد.‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬
‫ﺑﺎ ﯾﮏ ﺑﺮرﺳﯽ ﮐﻠّﯽ در ﻓﺎﯾﻠﻬﺎي ﺳﻮرسِ ﻟﯿﻨﻮﮐﺲ، ﻣﯽ ﺗﻮان ﻗﺴﻤﺘﻬﺎﯾﯽ ﮐﻪ ﺗﺤﺖ ﺗﺄﺛﯿﺮ ‪ASLR‬‬    ‫-‬
                                                 ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ﺷﺪه اﻧﺪ را ﯾﺎﻓﺖ:‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬

‫ﺑﺎ ﺑﺮرﺳﯽ دﻗﯿﻖ ﺗﺮ اﯾﻦ ﺳﻮرس ﻫﺎ ﻣﯽ ﺗﻮان اﻃﻼﻋﺎت ﺑﯿﺸﺘﺮي در ﻣﻮرد ﻧﺤﻮة ﺗﺼﺎدﻓﯽ ﺳﺎزي آدرس ﻫﺎ در‬      ‫-‬

                                                                        ‫‪ ASLR‬ﺑﺪﺳﺖ آورد:‬

‫در ﺻﻮرﺗﯽ ﮐﻪ ﺳﯿﺴﺘﻢ ﻓﺎﻗﺪ ‪ MMU‬ﺑﺎﺷﺪ )ﻧﻈﯿﺮ ﺑﺮﺧﯽ ﺳﯿﺴﺘﻢ ﻫﺎي ‪ ،(embedded‬ﺗﻌﺮﯾﻒ ﺗﺼﺎدﻓﯽ‬                ‫-‬

                                           ‫ﺳﺎزي در ﻓﺎﯾﻞ ‪ include/mm.h‬ﺻﻮرت ﻣﯽ ﭘﺬﯾﺮد.‬

                           ‫‪ MMU‬ﯾﮏ واﺣﺪ ﺳﺨﺖ اﻓﺰاري اﺳﺖ ﮐﻪ در اﮐﺜﺮ ﺳﯿﺴﺘﻢ ﻫﺎ وﺟﻮد دارد.‬        ‫-‬

‫ﻻزم ﺑﻪ ذﮐﺮ اﺳﺖ ﮐﻪ در ﺳﯿﺴﺘﻢ ﻫﺎي ﻟﯿﻨﻮﮐﺴﯽ )آﺧﺮﯾﻦ ﻧﺴﺨﻪ 93.6.2(، ﻗﺎﺑﻠﯿﺖ اﺳﺘﻔﺎده از ‪ MMU‬ﺑﻪ‬        ‫-‬

                                                           ‫ﺻﻮرت ﭘﯿﺶ ﻓﺮض ﻓﻌﺎل ﻣﯽ ﺑﺎﺷﺪ.‬

‫ﮐﺎرﺑﺮد ‪ MMU‬ﯾﺎ واﺣﺪ ﻣﺪﯾﺮﯾﺖ ﺣﺎﻓﻈﻪ در ﺳﯿﺴﺘﻢ ﻫﺎي اﻣﺮوزي، ﮐﻨﺘﺮل دﺳﺘﺮﺳﯽ ‪ CPU‬ﺑﻪ واﺣﺪ ﺣﺎﻓﻈﻪ‬         ‫-‬

                       ‫اﺳﺖ ﮐﻪ اﯾﻦ اﻣﺮ ﺷﺎﻣﻞ ﺗﺒﺪﯾﻞ آدرس ﻣﺠﺎزي ﺑﻪ آدرس ﻓﯿﺰﯾﮑﯽ و ... ﻣﯽ ﺑﺎﺷﺪ.‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬
‫ﺑﺴﯿﺎري از ﺗﻨﻈﯿﻤﺎت ﻓﻮق، ﮐﻨﺘﺮل ﻫﺎﯾﯽ اﺳﺖ ﮐﻪ ﺑﺴﺘﻪ ﺑﻪ ﻧﺤﻮه ﮐﺎﻣﭙﺎﯾﻞ ﮐﺮﻧﻞ اﻧﺠﺎم ﻣﯽ ﺷﻮد:‬   ‫-‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬
                             ‫ﯾﮑﯽ از اﯾﻦ ﻣﻮارد در ﻓﺎﯾﻞ ‪ personality.h‬ﻗﺎﺑﻞ ﺗﻨﻈﯿﻢ اﺳﺖ.‬    ‫-‬
‫اﯾﻦ ﻣﻘﺪار، اﻣﮑﺎنِ ﻏﯿﺮ ﻓﻌﺎل ﺳﺎزي ﻋﻤﻠﯿﺎت ﺗﺼﺎدﻓﯽ در ﻣﻮرد ﺗﺎﺑﻊ )(‪ mmap‬را ﻓﺮاﻫﻢ ﻣﯽ ﻧﻤﺎﯾﺪ:‬   ‫-‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬

‫ﻓﺎﯾﻞ ‪ /include/linux/sysctl.h‬ﺣﺎوي اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﻓﺮاﺧﻮاﻧﯽ ﺗﺎﺑﻊ )(‪ sysctl‬ﻣﯽ ﺑﺎﺷﺪ.‬       ‫-‬

 ‫اﯾﻦ ﺗﺎﺑﻊ ﻗﺎﺑﻠﯿﺖ ﺗﻨﻈﯿﻢ ﯾﮏ ﺳﺮي ﭘﺎراﻣﺘﺮ ﻫﺎي ﻓﻀﺎي ﮐﺮﻧﻞ را از ﻓﻀﺎي ﮐﺎرﺑﺮي ﻓﺮاﻫﻢ ﻣﯽ ﻧﻤﺎﯾﺪ.‬   ‫-‬

‫از ﺟﻤﻠﻪ اﯾﻦ ﻗﺎﺑﻠﯿﺖ ﻫﺎ، ﻗﺎﺑﻠﯿﺖ‪ KERN_RANDOMIZE ‬ﻣﯽ ﺑﺎﺷﺪ ﮐﻪ ﻣﺮﺑﻮط ﺑﻪ ﺗﺼﺎدﻓﯽ ﺳﺎزي‬           ‫-‬

                                                      ‫ﻓﻀﺎي ﺣﺎﻓﻈﮥ ﻣﺠﺎزي ﭘﺮوﺳﻪ اﺳﺖ.‬

    ‫ﺑﺮاي ﺳﯿﺴﺘﻢ ﻫﺎي ‪ ISA UniCore‬و ‪ ،PKUnity SoC‬ﺗﺼﺎدﻓﯽ ﺳﺎزي ‪ ،heap‬در ﻓﺎﯾﻠﻬﺎي‬              ‫-‬

 ‫‪ arch/unicore32/kernel/process.c‬و ‪arch/unicore32/include/asm/elf.h‬‬

                                                                       ‫اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬
‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬
‫ﺑﻨﺎﺑﺮاﯾﻦ ﺑﺎ ﺑﺮرﺳﯽ ﻓﺎﯾﻠﻬﺎﯾﯽ ﮐﻪ در آﻧﻬﺎ از ﺗﻮاﺑﻊ ﺗﺼﺎدﻓﯽ ﺳﺎزي اﺳﺘﻔﺎده ﺷﺪه، ﻣﯽ ﺗﻮان ﺑﻪ ﻧﺤﻮه‬    ‫-‬

                                     ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي در ﺳﺎﺧﺘﺎرﻫﺎي ﻣﺨﺘﻠﻒ ﻟﯿﻨﻮﮐﺴﯽ ﭘﯽ ﺑﺮد.‬

‫ﻧﻈﺮ ﺑﻪ ﻓﺮاواﻧﯽ اﺳﺘﻔﺎده از اﯾﻦ ﻧﻮع ﺗﻮاﺑﻊ و اﺳﺘﻔﺎده از آن در ﻣﻌﻤﺎري ﻫﺎي ﻣﺨﺘﻠﻒ ),‪ARM, MIPS‬‬    ‫-‬

                           ‫‪TILE‬و ...( ﺑﻪ ﺑﺮرﺳﯽ ﻓﺎﯾﻠﻬﺎي ﻣﻮرد ﺗﻮﺟﻪ در 68‪ x‬ﺑﺴﻨﺪه ﻣﯽ ﻧﻤﺎﯾﯿﻢ.‬

        ‫ﺑﺨﺶ ﻫﺎي ﻣﺨﺘﻠﻒ ﻋﻤﻠﯿﺎت ﺗﺼﺎدﻓﯽ ﺳﺎزي در ‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ 68‪ ،x‬از ﻗﺮار زﯾﺮ اﺳﺖ:‬           ‫-‬

                                                            ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي در ﭘﺸﺘﻪ.‬     ‫-‬

                                                   ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي در ﺗﺎﺑﻊ )(‪.mmap‬‬       ‫-‬

                                                           ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي در ‪.heap‬‬      ‫-‬

            ‫ﺑﺪﯾﻦ ﺗﺮﺗﯿﺐ ﻫﺮ ﺑﺨﺶ دﯾﮕﺮي ﮐﻪ از ﻣﻮارد ﻓﻮق اﺳﺘﻔﺎده ﻧﻤﺎﯾﺪ ﻧﯿﺰ ﺗﺼﺎدﻓﯽ ﺧﻮاﻫﺪ ﺷﺪ.‬     ‫-‬
‫‪ ASLR‬در ﭘﺸﺘﻪ‬
             ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ﭘﺸﺘﻪ، ﺑﻪ ﻫﻨﮕﺎم ﺑﺎرﮔﺰاري ﻓﺎﯾﻞ ﻫﺎ در ﺣﺎﻓﻈﻪ ﺻﻮرت ﻣﯽ ﭘﺬﯾﺮد.‬   ‫-‬
‫ﺑﺎرﮔﺰاري ﺑﺎﯾﻨﺮي ﻫﺎ ﺗﻮﺳﻂ ﺗﺎﺑﻊ )(‪ load_elf_binary‬ﺻﻮرت ﻣﯽ ﭘﺬﯾﺮد ﮐﻪ در ﻓﺎﯾﻞ‬            ‫-‬
                                                   ‫‪ fs/binfmt_elf.c‬ﺗﻌﺮﯾﻒ ﺷﺪه.‬
‫‪ ASLR‬در ﭘﺸﺘﻪ‬
  ‫در اﯾﻦ ﺗﺎﺑﻊ، ﭘﺲ از ﺗﻨﻈﯿﻢ ﻧﻤﻮدن ﯾﮏ ﺳﺮي ﻓﻠﮓ ﻫﺎ، از ﺗﻮاﺑﻊ دﯾﮕﺮي ﺟﻬﺖ ﺗﺼﺎدﻓﯽ ﺳﺎزي ﭘﺸﺘﻪ اﺳﺘﻔﺎده‬         ‫-‬
                                                                                      ‫ﺷﺪه اﺳﺖ:‬



                                                                                ‫‪ : Current‬ﯾﮏ ﻣﺎﮐﺮو‬
                                                                                ‫اﺳﺖ ﮐﻪ اﺷﺎره ﮔﺮي ﺑﻪ‬
                                                                                ‫اﺳﺘﺮاﮐﭽﺮِ ﭘﺮوﺳﮥ ﺟﺎري‬
                                                                                    ‫ﺑﺮ ﻣﯽ ﮔﺮداﻧﺪ.‬




           ‫در ﺻﻮرﺗﯽ ﮐﻪ در ﻣﺸﺨﺼﺎت ﭘﺮوﺳﮥ ﺟﺎري )‪ ،(include/linux/personality.h‬ﻣﻘﺪار‬
‫‪ ADDR_NO_RANDOMIZE‬ﺗﻨﻈﯿﻢ ﻧﺸﺪه ﺑﺎﺷﺪ و ﻣﺘﻐﯿﺮ ‪ randomize_va_space‬ﻧﯿﺰ ﺻﻔﺮ ﻧﺒﺎﺷﺪ، آﻧﮕﺎه‬
  ‫ﻓﻠﮓ‪ ‬ﺗﺼﺎدﻓﯽ ﺳﺎزي )‪ (PF_RANDOMIZE‬ﻧﯿﺰ ﻋﻼوه ﺑﺮ ﺳﺎﯾﺮ ﻓﻠﮓ ﻫﺎ در ﻣﻮرد اﯾﻦ ﭘﺮوﺳﻪ ﺳﺖ ﺧﻮاﻫﺪ ﺷﺪ.‬
‫ﺑﻪ ﻋﺒﺎرت ﺳﺎده ﺗﺮ، اﮔﺮ ﭘﺮوﺳﻪ ﻧﯿﺎزي ﺑﻪ آدرس ﻫﺎي ﺛﺎﺑﺖ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ و ‪ ASLR‬ﻓﻌﺎل ﺑﺎﺷﺪ، ﻓﻀﺎي آدرس ﭘﺮوﺳﻪ،‬
                                     ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ﻣﯽ ﺷﻮد.‬
‫‪ ASLR‬در ﭘﺸﺘﻪ‬
‫ﺳﭙﺲ ﺑﺎ ﻓﺮاﺧﻮاﻧﯽ ﺗﺎﺑﻊ )(‪ setup_arg_pages‬و ﭘﺎس دادن آدرس ‪ ToS‬ﺑﻪ آن، ﻓﻠﮓ ﻫﺎ و ﻣﺠﻮز ﻫﺎ، ﺑﻪ‬          ‫-‬
     ‫روز رﺳﺎﻧﯽ ﺷﺪه، ﭘﺸﺘﻪ ﺑﻪ دﻟﺨﻮاه ﺟﺎﯾﮕﺰاري ﻣﺠﺪد ﺷﺪه و ﻣﻘﺪاري ﻓﻀﺎي اﺿﺎﻓﻪ ﺑﻪ آن اﻓﺰوده ﻣﯽ ﺷﻮد.‬
‫در ﻫﻤﯿﻦ ﻣﺮﺣﻠﻪ از ﺗﺎﺑﻊ )(‪ randomize_stack_top‬اﺳﺘﻔﺎده ﻣﯽ ﺷﻮد ﺗﺎ ﻣﺤﻞ ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ ﺑﻪ‬             ‫-‬
                                                                   ‫ﺻﻮرت ﺗﺼﺎدﻓﯽ اﻧﺘﺨﺎب ﺷﻮد.‬
‫‪ ASLR‬در ﭘﺸﺘﻪ‬
‫ﻋﻤﻠﯿﺎت ﺗﺼﺎدﻓﯽ ﺳﺎزي در ﺗﺎﺑﻊ )(‪) randomize_stack_top‬ﮐﻪ در ﻫﻤﯿﻦ ﻓﺎﯾﻞ ﺗﻌﺮﯾﻒ ﺷﺪه اﺳﺖ( اﻧﺠﺎم‬                        ‫-‬
                                                                                               ‫ﻣﯽ ﺷﻮد.‬
‫ﻣﻘﺪار ﺑﺮﮔﺸﺘﯽ ﺗﻮﺳﻂ اﯾﻦ ﺗﺎﺑﻊ، ﻋﺒﺎرت اﺳﺖ از ﯾﮏ آدرس ﮐﻪ اﯾﻦ آدرس آدرس ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ ﻗﻠﻤﺪاد‬                       ‫-‬
                                                                                            ‫ﺧﻮاﻫﺪ ﺷﺪ.‬
   ‫در اﯾﻦ ﺗﺎﺑﻊ، ﻣﺤﻞ ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ، ﺑﻪ ﺻﻮرت ﺗﺼﺎدﻓﯽ ﺑﻪ اﻧﺪازة ‪ random_variable‬ﺟﺎﺑﺠﺎ ﻣﯽ ﺷﻮد.‬                    ‫-‬




                                                                      ‫‪ ،PAGE_ALIGN‬اﺷﺎره ﮔﺮ را‬
                                                                      ‫ﺑﻪ اﺑﺘﺪاي ‪ PAGE‬ﺑﻌﺪي ﺗﻨﻈﯿﻢ‬
                                                                                ‫ﻣﯽ ﻧﻤﺎﯾﺪ‬



                                                           ‫اﮔﺮ ﭘﺸﺘﻪ ﻫﻢ ﺟﻬﺖ ﺑﺎ آدرس ﻫﺎي ﺣﺎﻓﻈﻪ رﺷﺪ ﮐﻨﺪ، ﻣﻘﺪار‬
                                                    ‫‪ random_variable‬ﺑﻪ آدرﺳﯽ ﮐﻪ ﺗﻮﺳﻂ ‪ PAGE_ALIGN‬ﺑﺮﮔﺮداﻧﺪه‬
                                                        ‫ﻣﯽ ﺷﻮد، اﺿﺎﻓﻪ ﻣﯽ ﺷﻮد. و در ﻏﯿﺮ اﯾﻦ ﺻﻮرت اﯾﻦ ﻣﻘﺪار از آدرسِ‬
                                                        ‫‪ PAGE_ALIGN‬ﮐﻢ ﻣﯽ ﺷﻮد )ﻧﻈﯿﺮ ﺑﺮﺧﯽ ﻣﻌﻤﺎري ﻫﺎي ‪.(RISC‬‬
‫‪ ASLR‬در ﭘﺸﺘﻪ‬
‫ﻧﺤﻮه ﺗﺨﺼﯿﺺ ﻣﻘﺪار ﺑﻪ ﻣﺘﻐﯿﺮ ‪ random_variable‬در اﯾﻦ ﺗﺎﺑﻊ، ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ﮐﻤﮑﯽ‬                 ‫-‬

   ‫)(‪ get_random_int‬و ﺳﭙﺲ ﺷﯿﻔﺖ دادن اﯾﻦ آدرس ﺑﻪ ﻣﯿﺰانِ ‪ PAGE_SHIFT‬اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬

        ‫‪ PAGE_SHIFT‬در ﻣﻮرد 68‪ x‬ﺑﺮاﺑﺮ 21 ﺗﻌﺮﯾﻒ ﺷﺪه اﺳﺖ ﮐﻪ در ﻓﺎﯾﻞ زﯾﺮ ﻗﺎﺑﻞ ﻣﺸﺎﻫﺪ اﺳﺖ:‬           ‫-‬

                                        ‫)‪.(arch/x86/include/asm/page_types.h‬‬




                                                     ‫ﻣﻘﺪار ﺑﺪﺳﺖ آﻣﺪه از )(‪ get_random_int‬ﺑﺎ ﻣﻘﺪار‬
                                              ‫‪ STACK_RND_MASK‬ﺟﻤﻊ ﻣﻨﻄﻘﯽ ﺷﺪه و ﻧﺘﯿﺠﻪ ﻣﻘﺪارِ اوﻟﯿﮥ‬
                                                 ‫‪ random_variable‬را ﺗﺸﮑﯿﻞ ﻣﯽ دﻫﺪ )ﻗﺒﻞ از ﺷﯿﻔﺖ(.‬
                                              ‫‪ STACK_RND_MASK‬ﻧﯿﺰ ﻗﺒﻞ از ﺗﻌﺮﯾﻒ ﺗﺎﺑﻊ ﻣﻘﺪار دﻫﯽ ﺷﺪه‬
                                                ‫)ﻣﻘﺪار ﺛﺎﺑﺖ( و ﻣﺸﺨﺺ ﮐﻨﻨﺪة ﺑﯿﺖ ﻫﺎي ارزﺷﻤﻨﺪ در ﺗﺼﺎدﻓﯽ‬
                                                                      ‫ﺳﺎزي ﻣﯽ ﺑﺎﺷﺪ.‬
‫‪ PAGE_SHIFT‬ﭼﯿﺴﺖ؟‬

‫آدرس ﻫﺎي ﺣﺎﻓﻈﻪ اي ﮐﻪ در ﺳﻄﺢ ﮐﺮﻧﻞ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﯽ ﮔﯿﺮد، ﻧﻈﺮ ﺑﻪ اﺳﺘﻔﺎده از وﯾﮋﮔﯽ‬        ‫-‬

                                              ‫‪ ،PAGING‬ﻣﻀﺎرﺑﯽ از ﺣﺠﻢ ‪ PAGE‬ﻫﺎ ﻣﯽ ﺑﺎﺷﺪ.‬

                      ‫ﺣﺠﻢ ‪ PAGE‬ﻫﺎ در ‪ asm/page.h‬ﻗﺎﺑﻞ ﺗﻨﻈﯿﻢ اﺳﺖ )ﻣﺘﻐﯿﺮ ‪.(PAGE_SIZE‬‬          ‫-‬

                  ‫آدرس ﻫﺎي ﻣﻮرد اﺳﺘﻔﺎده در ﮐﺮﻧﻞ، ﺷﺎﻣﻞ دو ﻗﺴﻤﺖ ﭘﺮ ارزش و ﮐﻢ ارزش ﻣﯽ ﺑﺎﺷﺪ.‬   ‫-‬

       ‫ﻗﺴﻤﺖ ﭘﺮ ارزش، ﺑﻪ آدرسِ ‪ PAGE‬و ﻗﺴﻤﺖ ﮐﻢ ارزش ﺑﻪ آﻓﺴﺖ درون ‪ PAGE‬ﺗﺨﺼﯿﺺ ﻣﯽ ﯾﺎﺑﺪ.‬         ‫-‬

‫ﺑﺎ ﺷﯿﻔﺖ دادن اﯾﻦ آدرس ﻫﺎ و ﺑﺮون رﯾﺰي آﻓﺴﺖ‪ ،PAGE ‬ﻣﻘﺪاري ﮐﻪ ﺑﺎﻗﯽ ﺧﻮاﻫﺪ ﻣﺎﻧﺪ، اﺷﺎره ﮔﺮي ﺑﻪ‬   ‫-‬

                                                                         ‫‪ PAGE‬ﻣﯽ ﺑﺎﺷﺪ.‬

                               ‫‪ ،PAGE_SHIFT‬ﻣﯿﺰان اﯾﻦ ﺷﯿﻔﺖ را در ﺳﯿﺴﺘﻢ ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﺪ.‬         ‫-‬
‫‪ PAGE_SHIFT‬ﭼﯿﺴﺖ؟‬

 ‫ﺑﺎ 21 ﺑﯿﺖ ﻣﯽ ﺗﻮان درون ‪ PAGE‬را آدرس دﻫﯽ ﻧﻤﻮد.‬                                    ‫212 = 6904 = ‪PAGE_SIZE‬‬




  ‫‪A‬‬     ‫‪B‬‬    ‫‪C‬‬      ‫‪D‬‬       ‫‪E‬‬        ‫‪F‬‬      ‫‪G‬‬       ‫‪H‬‬        ‫‪I‬‬      ‫‪J‬‬   ‫‪K‬‬     ‫‪L‬‬     ‫‪M‬‬    ‫‪N‬‬    ‫‪O‬‬    ‫‪P‬‬   ‫‪Q‬‬




‫آدرﺳﯽ ﮐﻪ ﺑﻪ ﺧﻮد‪ PAGE ‬اﺷﺎره ﻣﯽ ﮐﻨﺪ‬                                 ‫آدرسِ ﻣﺤﺘﻮﯾﺎت درون ‪PAGE‬‬



  ‫0‬    ‫0‬     ‫0‬      ‫0‬       ‫0‬       ‫0‬       ‫0‬       ‫0‬       ‫0‬       ‫0‬   ‫0‬    ‫0‬      ‫‪A‬‬    ‫‪B‬‬    ‫‪C‬‬   ‫‪D‬‬    ‫‪E‬‬

            ‫ﺑﺎ 21 ﺑﯿﺖ ﺷﯿﻔﺖ ﺑﻪ ﺳﻤﺖ راﺳﺖ، آدرس ‪ PAGE‬را ﺑﺪﺳﺖ ﺧﻮاﻫﯿﻢ آورد‬



                   ‫‪ PAGE_SHIFT‬ﺑﺮاﺑﺮ 21 ﻣﯽ ﺑﺎﺷﺪ.‬
‫‪ ASLR‬در ﭘﺸﺘﻪ‬
‫ﻧﺤﻮه ﺗﺼﺎدﻓﯽ ﺳﺎزي در ﺗﺎﺑﻊ )(‪ get_random_int‬ﮐﻪ در ﻓﺎﯾﻞ ‪ drivers/char/random.c‬ﺗﻌﺮﯾﻒ‬               ‫-‬
                                                                   ‫ﺷﺪه از ﻗﺮار زﯾﺮ اﺳﺖ:‬




                                                   ‫ﭘﺲ از ﺗﻌﺮﯾﻒ آراﯾﮥ ‪ HASH‬و ﺗﻨﻈﯿﻢ آدرس آن‬
                                                       ‫)آدرسِ آراﯾﮥ ‪ ،(CPU‬ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ‬
                                                  ‫)(‪ ،get_keyptr‬ﻣﺘﻐﯿﺮِ ‪ keyptr‬ﻣﻘﺪار دﻫﯽ اوﻟﯿﻪ‬
                                                  ‫ﺷﺪه و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از آدرس آرﯾﮥ ‪ HASH‬ﺑﻪ‬
                                                    ‫ﻫﻤﺮاه ‪ PID‬ﭘﺮوﺳﻪ ﺟﺎري و ﺗﻌﺪاد ﺳﯿﮑﻞ ﻫﺎي‬
                                                   ‫ﭘﺮدازﻧﺪه و ﻣﺪت زﻣﺎن ﻓﻌﺎل ﺑﻮدن ﺳﯿﺴﺘﻢ، ﯾﮏ‬
                                                  ‫ﻣﻘﺪار ﺗﺼﺎدﻓﯽ در ﺧﺎﻧﻪ اول آراﯾﮥ ‪ HASH‬ﻗﺮار داده‬
                                                          ‫ﺷﺪه و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ‬
                                                   ‫)(‪ half_md4_transform‬اﯾﻦ ﻣﻘﺪار ﺑﺎز ﻫﻢ‬
                                                       ‫ﺗﺼﺎدﻓﯽ ﺗﺮ ﺷﺪه و ﺑﺎزﮔﺮداﻧﺪه ﻣﯽ ﺷﻮد‬
‫‪ ASLR‬در ﭘﺸﺘﻪ‬
  ‫ﺗﺎﺑﻊ )(‪ half_md4_transform‬ﮐﻪ در ﻓﺎﯾﻞِ ‪ lib/halfmd4.c‬ﺗﻌﺮﯾﻒ ﺷﺪه اﺳﺖ، ﯾﮏ‬               ‫-‬
‫ﭘﯿﺎده ﺳﺎزي ﻣﺨﺘﺼﺮ از اﻟﮕﻮرﯾﺘﻢ 4‪ MD‬ﻣﯽ ﺑﺎﺷﺪ ﮐﻪ در ﺳﻪ دورِ 8 ﺗﺎﯾﯽ و ﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ‬
                  ‫ﻫﺎي ‪ XOR‬و ‪ AND‬اﯾﻦ اﻟﮕﻮرﯾﺘﻢ را ﺑﺮروي ورودي ﺧﻮد اﻋﻤﺎل ﻣﯽ ﻧﻤﺎﯾﺪ.‬
‫‪ ASLR‬در ﭘﺸﺘﻪ‬
   ‫ﺑﺪﯾﻦ ﺗﺮﺗﯿﺐ ‪ ASLR‬در ﭘﺸﺘﻪ ﺑﺎ اﺳﺘﻔﺎده از 4 ﻣﻘﺪار اﺻﻠﯽ و ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ 4‪) MD‬ﯾﮏ ﭘﯿﺎده ﺳﺎزي‬     ‫-‬
                                                             ‫ﻣﺨﺘﺼﺮ از اﯾﻦ ﺗﺎﺑﻊ( اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬
                                                                    ‫اﯾﻦ ﻣﻘﺎدﯾﺮ اﺻﻠﯽ ﻋﺒﺎرﺗﻨﺪ از:‬   ‫-‬
                                                                 ‫ﺷﻤﺎره ﭘﺮوﺳﮥ اﺟﺮا ﺷﺪه.‬      ‫-‬
                                                              ‫ﺗﻌﺪاد ﺳﯿﮑﻞ ﻫﺎي ﭘﺮدازﻧﺪه.‬      ‫-‬
                                                          ‫ﻣﺪت زﻣﺎن روﺷﻦ ﺑﻮدن ﺳﯿﺴﺘﻢ.‬         ‫-‬
                     ‫اﯾﻦ ﭘﯿﺎده ﺳﺎزي اﺑﺘﺪاﯾﯽ ‪ ASLR‬در ﮐﺮﻧﻞ ﻟﯿﻨﻮﮐﺲ از ﻧﺴﺨﮥ 21.6.2 ﻗﺮار داده ﺷﺪ.‬      ‫-‬
‫ﺑﻨﺎﺑﺮاﯾﻦ ﺑﺎ درﻧﻈﺮ ﮔﺮﻓﺘﻦ ‪ STACK_RND_MASK‬ﮐﻪ ﺑﺎ ﺧﺮوﺟﯽ ﻣﻘﺪار ﺗﺼﺎدﻓﯽِ ﺗﻮﻟﯿﺪ ﺷﺪه از ﻣﻮارد ﻓﻮق،‬          ‫-‬
‫ﻣﺎﺳﮏ ﻣﯽ ﺷﻮد )ر.ك. ‪ ،(Binfmt_elf.c‬ﻣﯽ ﺗﻮان ﭼﻨﯿﻦ ﻧﺘﯿﺠﻪ ﮔﺮﻓﺖ ﮐﻪ ﺗﺼﺎدﻓﯽ ﺳﺎزي ﭘﺸﺘﻪ در ‪ِASLR‬‬
 ‫ﭘﯿﺶ ﻓﺮض ﻟﯿﻨﻮﮐﺲ، ﺑﺮروي 11 ﺑﯿﺖ اﻧﺠﺎم ﺷﺪه و 7402 آدرس ﺗﺼﺎدﻓﯽ ﻣﺨﺘﻠﻒ ﺟﻬﺖ ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ‬
                                                                                ‫ﺗﻮﻟﯿﺪ ﻣﯽ ﺷﻮد.‬
‫‪ ASLR‬در ‪heap‬‬
‫اﯾﻦ ﭘﯿﺎده ﺳﺎزي ﻧﯿﺰ ﻫﻨﮕﺎم ﺑﺎرﮔﺰاري ﻓﺎﯾﻠﻬﺎي ﺑﺎﯾﻨﺮي اﻧﺠﺎم ﻣﯽ ﺷﻮد ﮐﻪ در ﻓﺎﯾﻞ ‪fs/binfmt_elf.c‬‬     ‫-‬
                                                       ‫ﻣﯽ ﺗﻮان ﺟﺰﺋﯿﺎت آن را ﻣﺸﺎﻫﺪه ﻧﻤﻮد.‬




                                                         ‫ﭘﺲ از ﭼﮏ ﮐﺮدنِ ﻓﻠﮓ ﻫﺎي ﭘﺮوﺳﻪ و ﺑﺮرﺳﯽ‬
                                                          ‫‪ ،PF_RANDOMIZE‬در ﺻﻮرﺗﯽ ﮐﻪ ﮔﺰﯾﻨﮥ‬
                                                       ‫‪ randomize_va_space‬ﻧﯿﺰ ﺗﻨﻈﯿﻢ ﺷﺪه ﺑﺎﺷﺪ،‬
                                                            ‫آدرس ﺷﺮوعِ ‪ ،heap‬ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊِ‬
                                                      ‫)(‪ arch_randomize_brk‬ﺗﺨﺼﯿﺺ داده ﺧﻮاﻫﺪ‬
                                                                            ‫ﺷﺪ.‬
‫‪ ASLR‬در ‪heap‬‬
 ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ‪ heap‬در ﺗﺎﺑﻊ )(‪ arch_randomize_brk‬ﮐﻪ در ﻓﺎﯾﻞ‬                      ‫-‬
                        ‫‪ arch/x86/kernel/process.c‬ﺗﻌﺮﯾﻒ ﺷﺪه، اﻧﺠﺎم ﻣﯽ ﭘﺬﯾﺮد:‬




‫در اﯾﻦ ﺗﺎﺑﻊ از ﺗﺎﺑﻊِ ‪ randomize_range‬ﺑﻪ ﻣﻨﻈﻮر ﺗﺼﺎدﻓﯽ ﺳﺎزي آدرس ﺷﺮوع ‪heap‬‬
                             ‫اﺳﺘﻔﺎده ﻣﯽ ﺷﻮد.‬
‫‪ ASLR‬در ‪heap‬‬
‫ﺗﺎﺑﻊ )(‪ randomize_range‬در ﻓﺎﯾﻞ ‪ drivers/char/random.c‬ﺗﻌﺮﯾﻒ ﺷﺪه و ﯾﮏ‬           ‫-‬
                                     ‫آدرسِ ﺗﺼﺎدﻓﯽ ﺳﺎزي ﺷﺪه را ﺑﺮ ﻣﯽ ﮔﺮداﻧﺪ.‬




  ‫در اﯾﻦ ﺗﺎﺑﻊ ﻧﯿﺰ ﻫﻤﺎﻧﻨﺪ ﺗﺼﺎدﻓﯽ ﺳﺎزي آدرس ﻫﺎي ﭘﺸﺘﻪ، از ‪ PAGE_ALIGN‬و‬
‫)(‪ get_random_int‬اﺳﺘﻔﺎده ﺷﺪه ﮐﻪ در ﻧﺘﯿﺠﻪ ﯾﮏ آدرس ﺗﺼﺎدﻓﯽ ﺑﺮ ﻣﯽ ﮔﺮدد.‬
‫‪ ASLR‬در )(‪mmap‬‬
‫ﺗﻨﻈﯿﻤﺎت ﺗﺼﺎدﻓﯽ ﺳﺎزيِ ‪ mmap‬در ‪ ،ASLR‬ﺑﺴﺘﻪ ﺑﻪ ﭘﺮدازﻧﺪه ﻣﻮرد اﺳﺘﻔﺎده، در زﯾﺮﺷﺎﺧﮥ ﻣﺮﺑﻮﻃﻪ در‬       ‫-‬
                                                              ‫ﺷﺎﺧﮥ ‪ arch‬ﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ.‬




   ‫ﺗﺎﺑﻊِ )(‪ arch_pick_mmap_layout‬ﺑﻪ ﻣﺤﺾ اﯾﺠﺎد ﺣﺎﻓﻈﮥ‬
  ‫ﻣﺠﺎزي ﺑﺮاي ﻫﺮ ﭘﺮوﺳﻪ ﺻﺪا زده ﺷﺪه و ﺗﻨﻈﯿﻤﺎت ﻣﺮﺑﻮﻃﻪ را اﻧﺠﺎم‬            ‫ﺑﺴﺘﻪ ﺑﻪ ﺑﺮﺧﯽ ﻓﻠﮓ ﻫﺎ و ﭘﺎراﻣﺘﺮ‬
                          ‫ﻣﯽ دﻫﺪ‬                                        ‫ﻫﺎي ﭘﺮوﺳﮥ ﻓﺮاﺧﻮاﻧﺪه ﺷﺪه، اﯾﻦ‬
                                                                     ‫ﺗﺎﺑﻊ، )(‪ mmap_legacy_base‬و‬
                                                                       ‫ﯾﺎ )(‪ mmap_base‬را ﻓﺮاﺧﻮاﻧﯽ‬
                                                                                 ‫ﻣﯽ ﻧﻤﺎﯾﺪ.‬
‫‪ ASLR‬در )(‪mmap‬‬




‫ﺗﺎﺑﻊ ﻓﻮق، ﺑﺎ ﺑﺮرﺳﯽ ﻓﻠﮓ‪ ‬ﺳﺎزﮔﺎري در ﻣﻮرد ﭘﺮوﺳﻪ و ﻫﻤﭽﻨﯿﻦ در ﺻﻮرﺗﯽ ﮐﻪ ﻣﺤﺪودﯾﺘﯽ در اﺳﺘﻔﺎده از‬
‫ﻣﻨﺎﺑﻊ ﺑﺮاي اﯾﻦ ﭘﺮوﺳﻪ ﺗﻌﺮﯾﻒ ﻧﺸﺪه ﺑﺎﺷﺪ، ﭘﺮوﺳﮥ ﺟﺎري را ﺟﺰو ﭘﺮوﺳﻪ ﻫﺎي ﺟﺪﯾﺪ در ﻧﻈﺮ ﻣﯽ ﮔﯿﺮد ﮐﻪ‬
             ‫ﻧﯿﺎزي ﺑﻪ رﻋﺎﯾﺖ ﭘﯿﺶ ﺳﺎزﮔﺎري )ﺟﻬﺖ ﺗﺼﺎدﻓﯽ ﺳﺎزي( ﻧﺨﻮاﻫﺪ داﺷﺖ.‬
‫‪ ASLR‬در )(‪mmap‬‬


                 ‫در ﺻﻮرت ﻓﺮاﺧﻮاﻧﯽ ﻫﺮﯾﮏ از اﯾﻦ ﺗﻮاﺑﻊ، در‬
                 ‫ﺻﻮرﺗﯽ ﮐﻪ ﺑﻨﺎ ﺑﻪ ﺗﺼﺎدﻓﯽ ﺳﺎزي آدرس ﻫﺎ‬
                  ‫ﺑﺎﺷﺪ، از ﺗﺎﺑﻊ )(‪ mmap_rnd‬ﺑﺮاي اﯾﻦ‬
                        ‫ﻣﻨﻈﻮر اﺳﺘﻔﺎده ﺧﻮاﻫﺪ ﺷﺪ.‬
‫‪ ASLR‬در )(‪mmap‬‬




‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ‪ ،mmap‬در ﺗﺎﺑﻊِ )(‪ mmap_rnd‬و ﺑﺎ ﻫﻤﺎن ﺗﮑﻨﯿﮏ ﻣﻮرد اﺳﺘﻔﺎده در ﺗﺼﺎدﻓﯽ ﺳﺎزي‬
                  ‫‪) Stack‬ﺗﮑﻨﯿﮏ )(‪ (get_random_int‬اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬
    ‫ﺑﺮاي ﺳﯿﺴﺘﻢ ﻫﺎي 23 ﺑﯿﺘﯽ، 8 ﺑﯿﺖ ﺗﺼﺎدﻓﯽ ﺷﺪه و ﺑﺮاي ﺳﯿﺴﺘﻢ ﻫﺎي 46 ﺑﯿﺘﯽ، 82 ﺑﯿﺖ.‬
‫ﺟﻤﻊ ﺑﻨﺪي ‪ASLR‬‬

‫‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ ﭘﯿﺎده ﺳﺎزي ﻫﺎي ﻣﺨﺘﻠﻔﯽ دارد ﮐﻪ در ﮐﻠﯿﻪ ﭘﯿﺎده ﺳﺎزي ﻫﺎ، ﻓﻀﺎي آدرس ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﻪ ﺻﻮرت‬       ‫-‬

                                                                             ‫ﺗﺼﺎدﻓﯽ اﻧﺘﺨﺎب ﻣﯽ ﺷﻮد.‬

‫در ﺻﻮرﺗﯽ ﮐﻪ ﻣﺴﺌﻮل ﺳﯿﺴﺘﻢ ﻗﺼﺪ اﺳﺘﻔﺎده از ﭘﯿﺎده ﺳﺎزي ﻫﺎي ﮐﺎﻣﻞ ﺗﺮ ‪ ASLR‬را داﺷﺘﻪ ﺑﺎﺷﺪ، ﻣﯽ ﺑﺎﯾﺴﺖ وﺻﻠﻪ‬       ‫-‬

        ‫ﻫﺎي اﻣﻨﯿﺘﯽ اراﺋﻪ ﺷﺪه ﺗﻮﺳﻂ ﺷﺮﮐﺖ ﻫﺎﯾﯽ ﻧﻈﯿﺮ ‪ PaX‬را ﻧﺼﺐ ﻧﻤﺎﯾﺪ )ﮐﻪ در اﮐﺜﺮ ﻣﻮاﻗﻊ اﯾﻦ ﭼﻨﯿﻦ ﻧﯿﺴﺖ(.‬

              ‫در ‪ ASLR‬ﭘﯿﺶ ﻓﺮض ﻟﯿﻨﻮﮐﺲ، آدرس ﺑﺎرﮔﺰاري ﭘﺸﺘﻪ، ‪ heap‬و ‪ mmap‬ﺗﺼﺎدﻓﯽ ﺳﺎزي ﻣﯽ ﺷﻮد.‬             ‫-‬

‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ﺑﺮ ﻣﺒﻨﺎي آدرس اوﻟﯿﻪ، زﻣﺎن روﺷﻦ ﺑﻮدن ﺳﯿﺴﺘﻢ، ﺗﻌﺪاد ﺳﯿﮑﻞ ﻫﺎي ﭘﺮدازﻧﺪه و ‪ PID‬ﭘﺮوﺳﻪ ﺟﺎري‬       ‫-‬

                                                                                      ‫اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬

‫ﺑﺮاي اﯾﻨﮑﻪ اﻃﻼﻋﺎت ﺑﻪ ﻣﯿﺰان ﺑﯿﺸﺘﺮي ﻏﯿﺮ ﻗﺎﺑﻞ ﭘﯿﺶ ﺑﯿﻨﯽ ﺑﺎﺷﺪ، از ﯾﮏ اﻟﮕﻮرﯾﺘﻢ ﻣﺨﺘﺼﺮ 4‪ MD‬ﻧﯿﺰ اﺳﺘﻔﺎده ﻣﯽ‬     ‫-‬

                                                                                              ‫ﺷﻮد.‬
‫ﺑﺎ ﺳﭙﺎس، ﻣﻨﺘﻈﺮ درﯾﺎﻓﺖ ﭘﯿﺸﻨﻬﺎدﻫﺎ و دﯾﺪﮔﺎه ﻫﺎي‬
         ‫ﺷﻤﺎ درﺑﺎرة اﯾﻦ اﺳﻼﯾﺪ ﻫﺴﺘﻢ:‬
  ‫‪Mohammad.golyani@gmail.com‬‬

Linux Protections Against Exploits

  • 1.
    ‫ﺑﺮرﺳﯽ روﺷﻬﺎي ﺟﻠﻮﮔﯿﺮياز‬ ‫ﮐﺎرﮐﺮد اﮐﺴﭙﻠﻮﯾﺖ ﻫﺎ در ﻟﯿﻨﻮﮐﺲ‬ ‫ﻗﺴﻤﺖ ﯾﮑﻢ – ‪ASLR‬‬ ‫ﻣﺤﻤﺪ ﮔﻠﯿﺎﻧﯽ‬ ‫ﺧﺮداد 0931‬
  • 2.
    ‫ﻓﻬﺮﺳﺖ ﻣﻄﺎﻟﺐ‬ ‫ﻧﺤﻮه ﭘﯿﺎدهﺳﺎزي‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫-‬ ‫‪ ASLR‬ﭼﯿﺴﺖ؟‬ ‫-‬ ‫ﺑﺮرﺳﯽ ‪ ASLR‬در ‪Heap‬‬ ‫-‬ ‫ﻗﺒﻞ و ﺑﻌﺪ از ‪ASLR‬‬ ‫-‬ ‫ﺑﺮرﺳﯽ ‪ ASLR‬در ‪mmap‬‬ ‫-‬ ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ؟‬ ‫-‬ ‫ﺟﻤﻊ ﺑﻨﺪي‬ ‫-‬ ‫ﺑﺮرﺳﯽ ﺳﻮرس ﻓﺎﯾﻠﻬﺎي ‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ‬ ‫-‬
  • 3.
    ‫‪ASLR‬‬ ‫‪ ASLR‬ﯾﺎ ﺗﺼﺎدﻓﯽﺳﺎزي ﻓﻀﺎي آدرس، روﺷﯽ اﺳﺖ ﮐﻪ در آن، ﻓﻀﺎﻫﺎي ﮐﻠﯿﺪي ﺑﺮﻧﺎﻣﻪ از ﺣﺎﻟﺖ‬ ‫-‬ ‫ﺛﺎﺑﺖ و از ﭘﯿﺶ ﺗﻌﯿﯿﻦ ﺷﺪه، ﺑﻪ ﺣﺎﻟﺖ ﺗﺼﺎدﻓﯽ ﺗﻐﯿﯿﺮ ﭘﯿﺪا ﻣﯽ ﮐﻨﺪ.‬ ‫ﺑﺎ وﺟﻮد ‪ ،ASLR‬ﻧﻔﻮذﮔﺮ ﻗﺎدر ﺑﻪ ﺗﻌﯿﯿﻦ آدرس ﺑﺮﮔﺸﺖ ﻣﻨﺎﺳﺐ )ﮐﻪ ﺑﻪ ﮐﺪ‪ ‬دﻟﺨﻮاه او اﺷﺎره ﮐﻨﺪ(،‬ ‫-‬ ‫ﻧﺨﻮاﻫﺪ ﺑﻮد.‬ ‫‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ از ﻧﺴﺨﮥ 21.6.2 )5002 ‪ (May‬ﺑﻪ ﺻﻮرت ﭘﯿﺶ ﻓﺮض در ﺣﺪ ﺿﻌﯿﻔﯽ‬ ‫-‬ ‫ﻗﺮار داده ﺷﺪه اﺳﺖ.‬ ‫‪ PaX‬و ‪ ،exec-shield‬ﭘﯿﺎده ﺳﺎزي ﻫﺎي ﻗﻮي ﺗﺮي از اﯾﻦ روش در ﻟﯿﻨﻮﮐﺲ اراﺋﻪ ﮐﺮده اﻧﺪ.‬ ‫-‬ ‫اﮔﺮﭼﻪ اﯾﻦ ﺗﮑﻨﯿﮏ در ﮐﺮﻧﻞ ﻟﯿﻨﻮﮐﺲ از ﺳﺎل 5002 ﺑﻪ ﺻﻮرت ﭘﯿﺶ ﻓﺮض ﻗﺮار ﮔﺮﻓﺖ وﻟﯽ‬ ‫-‬ ‫‪ ،PaX‬در ﺳﺎل 1002 ﯾﮏ ﭘﯿﺎده ﺳﺎزي ﮐﺎﻣﻞ از اﯾﻦ ﺗﮑﻨﯿﮏ را اراﺋﻪ ﮐﺮده ﺑﻮد.‬
  • 4.
    ‫ﻗﺒﻞ از ‪ASLR‬‬ ‫ﺑﺪوناﺳﺘﻔﺎده از ﺗﮑﻨﯿﮏ ‪ ،ASLR‬آدرس ﺷﺮوع ﭘﺸﺘﻪ از ﻗﺒﻞ ﻣﺸﺨﺺ ﺑﻮده و ﺑﻨﺎﺑﺮاﯾﻦ ﻣﯽ ﺗﻮان‬ ‫-‬ ‫آدرس ﻗﺮارﮔﯿﺮي ﺷﻠﮑﺪ را ﺑﺪﺳﺖ آورد.‬ ‫در اﯾﻦ ﺣﺎﻟﺖ، ﺗﻨﻬﺎ ﮐﺎﻓﯽ اﺳﺖ آدرس ﺷﺮوع ﺷﻠﮑﺪ را ﺑﺮ روي ‪ EIP‬ﺑﺎزﻧﻮﯾﺴﯽ ﻧﻤﺎﯾﯿﻢ:‬ ‫-‬ ‫آدرس ﺷﻠﮑﺪ‬ ‫آدرس ﺷﻠﮑﺪ‬ ‫آدرس ﺷﻠﮑﺪ‬ ‫آدرس ﺷﻠﮑﺪ‬ ‫آدرس ﺷﻠﮑﺪ‬ ‫آدرس ﺷﻠﮑﺪ‬ ‫ﺑﺎﻓﺮ آﺳﯿﺐ‬ ‫‪IP‬‬ ‫ﺷﻠﮑﺪ‬ ‫ﻓﻀﺎي ﺣﺎﻓﻈﻪ‬ ‫ﭘﺬﯾﺮ‬ ‫)‪(EIP‬‬ ‫ﺳـــــﺮرﯾــــــــﺰ‬ ‫ﺳﺎﯾﺰ واﻗﻌﯽ ﺑﺎﻓﺮ‬
  • 5.
    ‫ﻗﺒﻞ از ‪ASLR‬‬ ‫وﺿﻌﯿﺖﻓﻀﺎي آدرس ﯾﮏ ﺑﺮﻧﺎﻣﻪ )‪ (cat‬در دو ﺑﺎر اﺟﺮاي ﻣﺨﺘﻠﻒ ﻗﺒﻞ از ﻓﻌﺎل ﺳﺎزي ‪ ASLR‬ﺑﻪ‬ ‫-‬ ‫ﺻﻮرت زﯾﺮ ﻣﯽ ﺑﺎﺷﺪ:‬
  • 6.
  • 7.
    ‫ﻗﺒﻞ از ‪ASLR‬‬ ‫- وﺿﻌﯿﺖ آدرس ﻫﺎ در دو اﺟﺮا از ﻗﺮار زﯾﺮ اﺳﺖ:‬ ‫اﺠﺮای دوم‬ ‫اﺠﺮای ﮑﻢ‬ ‫ﻤﮑﺎن ﺣﺎﻓﻈﻪ‬ ‫000‪0x0804e‬‬ ‫000‪0x0804e‬‬ ‫‪HEAP‬‬ ‫000‪0xbffea‬‬ ‫000‪0xbffea‬‬ ‫‪Stack‬‬ ‫00076‪0x00b‬‬ ‫00076‪0x00b‬‬ ‫‪Libc‬‬ ‫00084080‪0x‬‬ ‫00084080‪0x‬‬ ‫ﺧﻮد ِ ﻓﺎ ﻞ اﺠﺮا ـ‬ ‫آدرس ﻫﺎ در ﻫﺮ دو اﺟﺮا ﯾﮑﺴﺎن اﺳﺖ‬
  • 8.
    ‫ﺑﻌﺪ از ‪ASLR‬‬ ‫- ﺑﺎ اﺳﺘﻔﺎده از ‪ ،ASLR‬آدرس ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ، از ﻗﺒﻞ ﻧﺎﻣﺸﺨﺺ ﺧﻮاﻫﺪ ﺑﻮد.‬ ‫- ﺑﻪ دﻟﯿﻞ ﺗﺼﺎدﻓﯽ ﺑﻮدن ﻣﺤﻞ ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ، ﻧﻤﯽ ﺗﻮان آدرس ﺷﻠﮑﺪ را ﺑﻪ‬ ‫ﻫﻨﮕﺎم ﺑﺎرﮔﺰاري ﺑﺪﺳﺖ آورد.‬ ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬ ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬ ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬ ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬ ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬ ‫آدرس ﺷﻠﮑﺪ ﻣﻌﻠﻮم ﻧﯿﺴﺖ‬ ‫ﺑﺎﻓﺮ آﺳﯿﺐ‬ ‫‪IP‬‬ ‫ﺷﻠﮑﺪ‬ ‫ﻓﻀﺎي ﺣﺎﻓﻈﻪ‬ ‫ﭘﺬﯾﺮ‬ ‫)‪(EIP‬‬ ‫ﺑﺎ وﺟﻮد ﺳﺮرﯾﺰ، ﺑﻪ دﻟﯿﻞ ﻣﺸﺨﺺ‬ ‫)????????(‬ ‫ﻧﺒﻮدن آدرس ﺷﻠﮑﺪ، ﻧﻤﯽ ﺗﻮان ﺳﺎﯾﺰ واﻗﻌﯽ ﺑﺎﻓﺮ‬ ‫ﮐﻨﺘﺮل اﺟﺮا را ﺑﻪ آن اﻧﺘﻘﺎل داد‬
  • 9.
    ‫ﺑﻌﺪ از ‪ASLR‬‬ ‫وﺿﻌﯿﺖﻓﻀﺎي آدرس ﯾﮏ ﺑﺮﻧﺎﻣﻪ )‪ (cat‬در دو ﺑﺎر اﺟﺮاي ﻣﺨﺘﻠﻒ ﺑﻌﺪ از ﻓﻌﺎل ﺳﺎزي ‪ ASLR‬ﺑﻪ‬ ‫-‬ ‫ﺻﻮرت زﯾﺮ ﻣﯽ ﺑﺎﺷﺪ:‬
  • 10.
  • 11.
    ‫ﻗﺒﻞ از ‪ASLR‬‬ ‫وﺿﻌﯿﺖ آدرس ﻫﺎ در دو اﺟﺮا از ﻗﺮار زﯾﺮ اﺳﺖ:‬ ‫-‬ ‫اﺠﺮای دوم‬ ‫اﺠﺮای ﮑﻢ‬ ‫ﻤﮑﺎن ﺣﺎﻓﻈﻪ‬ ‫00060680‪0x‬‬ ‫0000‪0x08dd‬‬ ‫‪HEAP‬‬ ‫00061‪0xbfe‬‬ ‫000828‪0xbf‬‬ ‫‪Stack‬‬ ‫00076‪0x00b‬‬ ‫00076‪0x00b‬‬ ‫‪Libc‬‬ ‫00084080‪0x‬‬ ‫00084080‪0x‬‬ ‫ﺧﻮد ِ ﻓﺎ ﻞ اﺠﺮا ـ‬ ‫آدرس ‪ HEAP‬و ‪ STACK‬در ﻫﺮ اﺟﺮا ﻣﺘﻔﺎوت‬ ‫اﺳﺖ.‬
  • 12.
    ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎرﻣﯽ ﮐﻨﺪ؟‬ ‫‪ ،ASLR‬ﻣﮑﺎن ﻫﺎي ﻣﺨﺘﻠﻒ ﻗﺮار ﮔﯿﺮي ﯾﮏ ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ را ﺗﺼﺎدﻓﯽ ﻣﯽ ﻧﻤﺎﯾﺪ.‬ ‫-‬ ‫ﺑﺎ ﻫﺮ ﺑﺎر اﺟﺮاي ﺑﺮﻧﺎﻣﻪ، آدرس اﯾﻦ ﻣﮑﺎن ﻫﺎي ﺣﺎﻓﻈﻪ ﻧﺴﺒﺖ ﺑﻪ اﺟﺮاي ﻗﺒﻠﯽ ﻣﺘﻔﺎوت ﺧﻮاﻫﺪ ﺑﻮد.‬ ‫-‬ ‫‪ ،ASLR‬در ﻟﯿﻨﻮﮐﺲ از ﻧﺴﺨﮥ 21.6.2 درون ﮐﺮﻧﻞ ﻗﺮار داده ﺷﺪ.‬ ‫-‬ ‫ﻗﺒﻞ از 5002 )21.6.2(، ‪ ASLR‬ﺗﻮﺳﻂ ‪ PaX‬در ﺳﺎل 1002 ﻣﻌﺮﻓﯽ ﺷﺪه ﺑﻮد.‬ ‫-‬ ‫‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ ﻋﻤﻠﯿﺎت ﺗﺼﺎدﻓﯽ ﺳﺎزي را ﺑﺮروي ﺑﺎﯾﻨﺮي ﻫﺎي ‪ ELF‬اﻧﺠﺎم ﻣﯽ دﻫﺪ. ﺑﻨﺎﺑﺮاﯾﻦ‬ ‫-‬ ‫ﻣﯽ ﺗﻮان اﯾﻦ ﭘﯿﺎده ﺳﺎزي را در ﺗﻮاﺑﻊِ ﮐﺘﺎﺑﺨﺎﻧﻪ اي ‪) ELF‬و ﺳﺎﯾﺮ ﺗﻮاﺑﻊ( ﺟﺴﺘﺠﻮ ﻧﻤﻮد.‬
  • 13.
    ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎرﻣﯽ ﮐﻨﺪ؟‬ ‫ﺑﺎ ﯾﮏ ﺑﺮرﺳﯽ ﮐﻠّﯽ در ﻓﺎﯾﻠﻬﺎي ﺳﻮرسِ ﻟﯿﻨﻮﮐﺲ، ﻣﯽ ﺗﻮان ﻗﺴﻤﺘﻬﺎﯾﯽ ﮐﻪ ﺗﺤﺖ ﺗﺄﺛﯿﺮ ‪ASLR‬‬ ‫-‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ﺷﺪه اﻧﺪ را ﯾﺎﻓﺖ:‬
  • 14.
  • 15.
    ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎرﻣﯽ ﮐﻨﺪ؟‬ ‫ﺑﺎ ﺑﺮرﺳﯽ دﻗﯿﻖ ﺗﺮ اﯾﻦ ﺳﻮرس ﻫﺎ ﻣﯽ ﺗﻮان اﻃﻼﻋﺎت ﺑﯿﺸﺘﺮي در ﻣﻮرد ﻧﺤﻮة ﺗﺼﺎدﻓﯽ ﺳﺎزي آدرس ﻫﺎ در‬ ‫-‬ ‫‪ ASLR‬ﺑﺪﺳﺖ آورد:‬ ‫در ﺻﻮرﺗﯽ ﮐﻪ ﺳﯿﺴﺘﻢ ﻓﺎﻗﺪ ‪ MMU‬ﺑﺎﺷﺪ )ﻧﻈﯿﺮ ﺑﺮﺧﯽ ﺳﯿﺴﺘﻢ ﻫﺎي ‪ ،(embedded‬ﺗﻌﺮﯾﻒ ﺗﺼﺎدﻓﯽ‬ ‫-‬ ‫ﺳﺎزي در ﻓﺎﯾﻞ ‪ include/mm.h‬ﺻﻮرت ﻣﯽ ﭘﺬﯾﺮد.‬ ‫‪ MMU‬ﯾﮏ واﺣﺪ ﺳﺨﺖ اﻓﺰاري اﺳﺖ ﮐﻪ در اﮐﺜﺮ ﺳﯿﺴﺘﻢ ﻫﺎ وﺟﻮد دارد.‬ ‫-‬ ‫ﻻزم ﺑﻪ ذﮐﺮ اﺳﺖ ﮐﻪ در ﺳﯿﺴﺘﻢ ﻫﺎي ﻟﯿﻨﻮﮐﺴﯽ )آﺧﺮﯾﻦ ﻧﺴﺨﻪ 93.6.2(، ﻗﺎﺑﻠﯿﺖ اﺳﺘﻔﺎده از ‪ MMU‬ﺑﻪ‬ ‫-‬ ‫ﺻﻮرت ﭘﯿﺶ ﻓﺮض ﻓﻌﺎل ﻣﯽ ﺑﺎﺷﺪ.‬ ‫ﮐﺎرﺑﺮد ‪ MMU‬ﯾﺎ واﺣﺪ ﻣﺪﯾﺮﯾﺖ ﺣﺎﻓﻈﻪ در ﺳﯿﺴﺘﻢ ﻫﺎي اﻣﺮوزي، ﮐﻨﺘﺮل دﺳﺘﺮﺳﯽ ‪ CPU‬ﺑﻪ واﺣﺪ ﺣﺎﻓﻈﻪ‬ ‫-‬ ‫اﺳﺖ ﮐﻪ اﯾﻦ اﻣﺮ ﺷﺎﻣﻞ ﺗﺒﺪﯾﻞ آدرس ﻣﺠﺎزي ﺑﻪ آدرس ﻓﯿﺰﯾﮑﯽ و ... ﻣﯽ ﺑﺎﺷﺪ.‬
  • 16.
  • 17.
    ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎرﻣﯽ ﮐﻨﺪ؟‬ ‫ﺑﺴﯿﺎري از ﺗﻨﻈﯿﻤﺎت ﻓﻮق، ﮐﻨﺘﺮل ﻫﺎﯾﯽ اﺳﺖ ﮐﻪ ﺑﺴﺘﻪ ﺑﻪ ﻧﺤﻮه ﮐﺎﻣﭙﺎﯾﻞ ﮐﺮﻧﻞ اﻧﺠﺎم ﻣﯽ ﺷﻮد:‬ ‫-‬
  • 18.
  • 19.
    ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎرﻣﯽ ﮐﻨﺪ؟‬ ‫ﯾﮑﯽ از اﯾﻦ ﻣﻮارد در ﻓﺎﯾﻞ ‪ personality.h‬ﻗﺎﺑﻞ ﺗﻨﻈﯿﻢ اﺳﺖ.‬ ‫-‬ ‫اﯾﻦ ﻣﻘﺪار، اﻣﮑﺎنِ ﻏﯿﺮ ﻓﻌﺎل ﺳﺎزي ﻋﻤﻠﯿﺎت ﺗﺼﺎدﻓﯽ در ﻣﻮرد ﺗﺎﺑﻊ )(‪ mmap‬را ﻓﺮاﻫﻢ ﻣﯽ ﻧﻤﺎﯾﺪ:‬ ‫-‬
  • 20.
    ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎرﻣﯽ ﮐﻨﺪ؟‬ ‫ﻓﺎﯾﻞ ‪ /include/linux/sysctl.h‬ﺣﺎوي اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﻓﺮاﺧﻮاﻧﯽ ﺗﺎﺑﻊ )(‪ sysctl‬ﻣﯽ ﺑﺎﺷﺪ.‬ ‫-‬ ‫اﯾﻦ ﺗﺎﺑﻊ ﻗﺎﺑﻠﯿﺖ ﺗﻨﻈﯿﻢ ﯾﮏ ﺳﺮي ﭘﺎراﻣﺘﺮ ﻫﺎي ﻓﻀﺎي ﮐﺮﻧﻞ را از ﻓﻀﺎي ﮐﺎرﺑﺮي ﻓﺮاﻫﻢ ﻣﯽ ﻧﻤﺎﯾﺪ.‬ ‫-‬ ‫از ﺟﻤﻠﻪ اﯾﻦ ﻗﺎﺑﻠﯿﺖ ﻫﺎ، ﻗﺎﺑﻠﯿﺖ‪ KERN_RANDOMIZE ‬ﻣﯽ ﺑﺎﺷﺪ ﮐﻪ ﻣﺮﺑﻮط ﺑﻪ ﺗﺼﺎدﻓﯽ ﺳﺎزي‬ ‫-‬ ‫ﻓﻀﺎي ﺣﺎﻓﻈﮥ ﻣﺠﺎزي ﭘﺮوﺳﻪ اﺳﺖ.‬ ‫ﺑﺮاي ﺳﯿﺴﺘﻢ ﻫﺎي ‪ ISA UniCore‬و ‪ ،PKUnity SoC‬ﺗﺼﺎدﻓﯽ ﺳﺎزي ‪ ،heap‬در ﻓﺎﯾﻠﻬﺎي‬ ‫-‬ ‫‪ arch/unicore32/kernel/process.c‬و ‪arch/unicore32/include/asm/elf.h‬‬ ‫اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬
  • 21.
    ‫‪ ASLR‬ﭼﮕﻮﻧﻪ ﮐﺎرﻣﯽ ﮐﻨﺪ؟‬ ‫ﺑﻨﺎﺑﺮاﯾﻦ ﺑﺎ ﺑﺮرﺳﯽ ﻓﺎﯾﻠﻬﺎﯾﯽ ﮐﻪ در آﻧﻬﺎ از ﺗﻮاﺑﻊ ﺗﺼﺎدﻓﯽ ﺳﺎزي اﺳﺘﻔﺎده ﺷﺪه، ﻣﯽ ﺗﻮان ﺑﻪ ﻧﺤﻮه‬ ‫-‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي در ﺳﺎﺧﺘﺎرﻫﺎي ﻣﺨﺘﻠﻒ ﻟﯿﻨﻮﮐﺴﯽ ﭘﯽ ﺑﺮد.‬ ‫ﻧﻈﺮ ﺑﻪ ﻓﺮاواﻧﯽ اﺳﺘﻔﺎده از اﯾﻦ ﻧﻮع ﺗﻮاﺑﻊ و اﺳﺘﻔﺎده از آن در ﻣﻌﻤﺎري ﻫﺎي ﻣﺨﺘﻠﻒ ),‪ARM, MIPS‬‬ ‫-‬ ‫‪TILE‬و ...( ﺑﻪ ﺑﺮرﺳﯽ ﻓﺎﯾﻠﻬﺎي ﻣﻮرد ﺗﻮﺟﻪ در 68‪ x‬ﺑﺴﻨﺪه ﻣﯽ ﻧﻤﺎﯾﯿﻢ.‬ ‫ﺑﺨﺶ ﻫﺎي ﻣﺨﺘﻠﻒ ﻋﻤﻠﯿﺎت ﺗﺼﺎدﻓﯽ ﺳﺎزي در ‪ ASLR‬در ﻟﯿﻨﻮﮐﺲ 68‪ ،x‬از ﻗﺮار زﯾﺮ اﺳﺖ:‬ ‫-‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي در ﭘﺸﺘﻪ.‬ ‫-‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي در ﺗﺎﺑﻊ )(‪.mmap‬‬ ‫-‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي در ‪.heap‬‬ ‫-‬ ‫ﺑﺪﯾﻦ ﺗﺮﺗﯿﺐ ﻫﺮ ﺑﺨﺶ دﯾﮕﺮي ﮐﻪ از ﻣﻮارد ﻓﻮق اﺳﺘﻔﺎده ﻧﻤﺎﯾﺪ ﻧﯿﺰ ﺗﺼﺎدﻓﯽ ﺧﻮاﻫﺪ ﺷﺪ.‬ ‫-‬
  • 22.
    ‫‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ﭘﺸﺘﻪ، ﺑﻪ ﻫﻨﮕﺎم ﺑﺎرﮔﺰاري ﻓﺎﯾﻞ ﻫﺎ در ﺣﺎﻓﻈﻪ ﺻﻮرت ﻣﯽ ﭘﺬﯾﺮد.‬ ‫-‬ ‫ﺑﺎرﮔﺰاري ﺑﺎﯾﻨﺮي ﻫﺎ ﺗﻮﺳﻂ ﺗﺎﺑﻊ )(‪ load_elf_binary‬ﺻﻮرت ﻣﯽ ﭘﺬﯾﺮد ﮐﻪ در ﻓﺎﯾﻞ‬ ‫-‬ ‫‪ fs/binfmt_elf.c‬ﺗﻌﺮﯾﻒ ﺷﺪه.‬
  • 23.
    ‫‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫در اﯾﻦ ﺗﺎﺑﻊ، ﭘﺲ از ﺗﻨﻈﯿﻢ ﻧﻤﻮدن ﯾﮏ ﺳﺮي ﻓﻠﮓ ﻫﺎ، از ﺗﻮاﺑﻊ دﯾﮕﺮي ﺟﻬﺖ ﺗﺼﺎدﻓﯽ ﺳﺎزي ﭘﺸﺘﻪ اﺳﺘﻔﺎده‬ ‫-‬ ‫ﺷﺪه اﺳﺖ:‬ ‫‪ : Current‬ﯾﮏ ﻣﺎﮐﺮو‬ ‫اﺳﺖ ﮐﻪ اﺷﺎره ﮔﺮي ﺑﻪ‬ ‫اﺳﺘﺮاﮐﭽﺮِ ﭘﺮوﺳﮥ ﺟﺎري‬ ‫ﺑﺮ ﻣﯽ ﮔﺮداﻧﺪ.‬ ‫در ﺻﻮرﺗﯽ ﮐﻪ در ﻣﺸﺨﺼﺎت ﭘﺮوﺳﮥ ﺟﺎري )‪ ،(include/linux/personality.h‬ﻣﻘﺪار‬ ‫‪ ADDR_NO_RANDOMIZE‬ﺗﻨﻈﯿﻢ ﻧﺸﺪه ﺑﺎﺷﺪ و ﻣﺘﻐﯿﺮ ‪ randomize_va_space‬ﻧﯿﺰ ﺻﻔﺮ ﻧﺒﺎﺷﺪ، آﻧﮕﺎه‬ ‫ﻓﻠﮓ‪ ‬ﺗﺼﺎدﻓﯽ ﺳﺎزي )‪ (PF_RANDOMIZE‬ﻧﯿﺰ ﻋﻼوه ﺑﺮ ﺳﺎﯾﺮ ﻓﻠﮓ ﻫﺎ در ﻣﻮرد اﯾﻦ ﭘﺮوﺳﻪ ﺳﺖ ﺧﻮاﻫﺪ ﺷﺪ.‬ ‫ﺑﻪ ﻋﺒﺎرت ﺳﺎده ﺗﺮ، اﮔﺮ ﭘﺮوﺳﻪ ﻧﯿﺎزي ﺑﻪ آدرس ﻫﺎي ﺛﺎﺑﺖ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ و ‪ ASLR‬ﻓﻌﺎل ﺑﺎﺷﺪ، ﻓﻀﺎي آدرس ﭘﺮوﺳﻪ،‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ﻣﯽ ﺷﻮد.‬
  • 24.
    ‫‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫ﺳﭙﺲﺑﺎ ﻓﺮاﺧﻮاﻧﯽ ﺗﺎﺑﻊ )(‪ setup_arg_pages‬و ﭘﺎس دادن آدرس ‪ ToS‬ﺑﻪ آن، ﻓﻠﮓ ﻫﺎ و ﻣﺠﻮز ﻫﺎ، ﺑﻪ‬ ‫-‬ ‫روز رﺳﺎﻧﯽ ﺷﺪه، ﭘﺸﺘﻪ ﺑﻪ دﻟﺨﻮاه ﺟﺎﯾﮕﺰاري ﻣﺠﺪد ﺷﺪه و ﻣﻘﺪاري ﻓﻀﺎي اﺿﺎﻓﻪ ﺑﻪ آن اﻓﺰوده ﻣﯽ ﺷﻮد.‬ ‫در ﻫﻤﯿﻦ ﻣﺮﺣﻠﻪ از ﺗﺎﺑﻊ )(‪ randomize_stack_top‬اﺳﺘﻔﺎده ﻣﯽ ﺷﻮد ﺗﺎ ﻣﺤﻞ ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ ﺑﻪ‬ ‫-‬ ‫ﺻﻮرت ﺗﺼﺎدﻓﯽ اﻧﺘﺨﺎب ﺷﻮد.‬
  • 25.
    ‫‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫ﻋﻤﻠﯿﺎتﺗﺼﺎدﻓﯽ ﺳﺎزي در ﺗﺎﺑﻊ )(‪) randomize_stack_top‬ﮐﻪ در ﻫﻤﯿﻦ ﻓﺎﯾﻞ ﺗﻌﺮﯾﻒ ﺷﺪه اﺳﺖ( اﻧﺠﺎم‬ ‫-‬ ‫ﻣﯽ ﺷﻮد.‬ ‫ﻣﻘﺪار ﺑﺮﮔﺸﺘﯽ ﺗﻮﺳﻂ اﯾﻦ ﺗﺎﺑﻊ، ﻋﺒﺎرت اﺳﺖ از ﯾﮏ آدرس ﮐﻪ اﯾﻦ آدرس آدرس ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ ﻗﻠﻤﺪاد‬ ‫-‬ ‫ﺧﻮاﻫﺪ ﺷﺪ.‬ ‫در اﯾﻦ ﺗﺎﺑﻊ، ﻣﺤﻞ ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ، ﺑﻪ ﺻﻮرت ﺗﺼﺎدﻓﯽ ﺑﻪ اﻧﺪازة ‪ random_variable‬ﺟﺎﺑﺠﺎ ﻣﯽ ﺷﻮد.‬ ‫-‬ ‫‪ ،PAGE_ALIGN‬اﺷﺎره ﮔﺮ را‬ ‫ﺑﻪ اﺑﺘﺪاي ‪ PAGE‬ﺑﻌﺪي ﺗﻨﻈﯿﻢ‬ ‫ﻣﯽ ﻧﻤﺎﯾﺪ‬ ‫اﮔﺮ ﭘﺸﺘﻪ ﻫﻢ ﺟﻬﺖ ﺑﺎ آدرس ﻫﺎي ﺣﺎﻓﻈﻪ رﺷﺪ ﮐﻨﺪ، ﻣﻘﺪار‬ ‫‪ random_variable‬ﺑﻪ آدرﺳﯽ ﮐﻪ ﺗﻮﺳﻂ ‪ PAGE_ALIGN‬ﺑﺮﮔﺮداﻧﺪه‬ ‫ﻣﯽ ﺷﻮد، اﺿﺎﻓﻪ ﻣﯽ ﺷﻮد. و در ﻏﯿﺮ اﯾﻦ ﺻﻮرت اﯾﻦ ﻣﻘﺪار از آدرسِ‬ ‫‪ PAGE_ALIGN‬ﮐﻢ ﻣﯽ ﺷﻮد )ﻧﻈﯿﺮ ﺑﺮﺧﯽ ﻣﻌﻤﺎري ﻫﺎي ‪.(RISC‬‬
  • 26.
    ‫‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫ﻧﺤﻮهﺗﺨﺼﯿﺺ ﻣﻘﺪار ﺑﻪ ﻣﺘﻐﯿﺮ ‪ random_variable‬در اﯾﻦ ﺗﺎﺑﻊ، ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ﮐﻤﮑﯽ‬ ‫-‬ ‫)(‪ get_random_int‬و ﺳﭙﺲ ﺷﯿﻔﺖ دادن اﯾﻦ آدرس ﺑﻪ ﻣﯿﺰانِ ‪ PAGE_SHIFT‬اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬ ‫‪ PAGE_SHIFT‬در ﻣﻮرد 68‪ x‬ﺑﺮاﺑﺮ 21 ﺗﻌﺮﯾﻒ ﺷﺪه اﺳﺖ ﮐﻪ در ﻓﺎﯾﻞ زﯾﺮ ﻗﺎﺑﻞ ﻣﺸﺎﻫﺪ اﺳﺖ:‬ ‫-‬ ‫)‪.(arch/x86/include/asm/page_types.h‬‬ ‫ﻣﻘﺪار ﺑﺪﺳﺖ آﻣﺪه از )(‪ get_random_int‬ﺑﺎ ﻣﻘﺪار‬ ‫‪ STACK_RND_MASK‬ﺟﻤﻊ ﻣﻨﻄﻘﯽ ﺷﺪه و ﻧﺘﯿﺠﻪ ﻣﻘﺪارِ اوﻟﯿﮥ‬ ‫‪ random_variable‬را ﺗﺸﮑﯿﻞ ﻣﯽ دﻫﺪ )ﻗﺒﻞ از ﺷﯿﻔﺖ(.‬ ‫‪ STACK_RND_MASK‬ﻧﯿﺰ ﻗﺒﻞ از ﺗﻌﺮﯾﻒ ﺗﺎﺑﻊ ﻣﻘﺪار دﻫﯽ ﺷﺪه‬ ‫)ﻣﻘﺪار ﺛﺎﺑﺖ( و ﻣﺸﺨﺺ ﮐﻨﻨﺪة ﺑﯿﺖ ﻫﺎي ارزﺷﻤﻨﺪ در ﺗﺼﺎدﻓﯽ‬ ‫ﺳﺎزي ﻣﯽ ﺑﺎﺷﺪ.‬
  • 27.
    ‫‪ PAGE_SHIFT‬ﭼﯿﺴﺖ؟‬ ‫آدرس ﻫﺎيﺣﺎﻓﻈﻪ اي ﮐﻪ در ﺳﻄﺢ ﮐﺮﻧﻞ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﯽ ﮔﯿﺮد، ﻧﻈﺮ ﺑﻪ اﺳﺘﻔﺎده از وﯾﮋﮔﯽ‬ ‫-‬ ‫‪ ،PAGING‬ﻣﻀﺎرﺑﯽ از ﺣﺠﻢ ‪ PAGE‬ﻫﺎ ﻣﯽ ﺑﺎﺷﺪ.‬ ‫ﺣﺠﻢ ‪ PAGE‬ﻫﺎ در ‪ asm/page.h‬ﻗﺎﺑﻞ ﺗﻨﻈﯿﻢ اﺳﺖ )ﻣﺘﻐﯿﺮ ‪.(PAGE_SIZE‬‬ ‫-‬ ‫آدرس ﻫﺎي ﻣﻮرد اﺳﺘﻔﺎده در ﮐﺮﻧﻞ، ﺷﺎﻣﻞ دو ﻗﺴﻤﺖ ﭘﺮ ارزش و ﮐﻢ ارزش ﻣﯽ ﺑﺎﺷﺪ.‬ ‫-‬ ‫ﻗﺴﻤﺖ ﭘﺮ ارزش، ﺑﻪ آدرسِ ‪ PAGE‬و ﻗﺴﻤﺖ ﮐﻢ ارزش ﺑﻪ آﻓﺴﺖ درون ‪ PAGE‬ﺗﺨﺼﯿﺺ ﻣﯽ ﯾﺎﺑﺪ.‬ ‫-‬ ‫ﺑﺎ ﺷﯿﻔﺖ دادن اﯾﻦ آدرس ﻫﺎ و ﺑﺮون رﯾﺰي آﻓﺴﺖ‪ ،PAGE ‬ﻣﻘﺪاري ﮐﻪ ﺑﺎﻗﯽ ﺧﻮاﻫﺪ ﻣﺎﻧﺪ، اﺷﺎره ﮔﺮي ﺑﻪ‬ ‫-‬ ‫‪ PAGE‬ﻣﯽ ﺑﺎﺷﺪ.‬ ‫‪ ،PAGE_SHIFT‬ﻣﯿﺰان اﯾﻦ ﺷﯿﻔﺖ را در ﺳﯿﺴﺘﻢ ﻣﺸﺨﺺ ﻣﯽ ﮐﻨﺪ.‬ ‫-‬
  • 28.
    ‫‪ PAGE_SHIFT‬ﭼﯿﺴﺖ؟‬ ‫ﺑﺎ21 ﺑﯿﺖ ﻣﯽ ﺗﻮان درون ‪ PAGE‬را آدرس دﻫﯽ ﻧﻤﻮد.‬ ‫212 = 6904 = ‪PAGE_SIZE‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪G‬‬ ‫‪H‬‬ ‫‪I‬‬ ‫‪J‬‬ ‫‪K‬‬ ‫‪L‬‬ ‫‪M‬‬ ‫‪N‬‬ ‫‪O‬‬ ‫‪P‬‬ ‫‪Q‬‬ ‫آدرﺳﯽ ﮐﻪ ﺑﻪ ﺧﻮد‪ PAGE ‬اﺷﺎره ﻣﯽ ﮐﻨﺪ‬ ‫آدرسِ ﻣﺤﺘﻮﯾﺎت درون ‪PAGE‬‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫0‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫ﺑﺎ 21 ﺑﯿﺖ ﺷﯿﻔﺖ ﺑﻪ ﺳﻤﺖ راﺳﺖ، آدرس ‪ PAGE‬را ﺑﺪﺳﺖ ﺧﻮاﻫﯿﻢ آورد‬ ‫‪ PAGE_SHIFT‬ﺑﺮاﺑﺮ 21 ﻣﯽ ﺑﺎﺷﺪ.‬
  • 29.
    ‫‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫ﻧﺤﻮهﺗﺼﺎدﻓﯽ ﺳﺎزي در ﺗﺎﺑﻊ )(‪ get_random_int‬ﮐﻪ در ﻓﺎﯾﻞ ‪ drivers/char/random.c‬ﺗﻌﺮﯾﻒ‬ ‫-‬ ‫ﺷﺪه از ﻗﺮار زﯾﺮ اﺳﺖ:‬ ‫ﭘﺲ از ﺗﻌﺮﯾﻒ آراﯾﮥ ‪ HASH‬و ﺗﻨﻈﯿﻢ آدرس آن‬ ‫)آدرسِ آراﯾﮥ ‪ ،(CPU‬ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ‬ ‫)(‪ ،get_keyptr‬ﻣﺘﻐﯿﺮِ ‪ keyptr‬ﻣﻘﺪار دﻫﯽ اوﻟﯿﻪ‬ ‫ﺷﺪه و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از آدرس آرﯾﮥ ‪ HASH‬ﺑﻪ‬ ‫ﻫﻤﺮاه ‪ PID‬ﭘﺮوﺳﻪ ﺟﺎري و ﺗﻌﺪاد ﺳﯿﮑﻞ ﻫﺎي‬ ‫ﭘﺮدازﻧﺪه و ﻣﺪت زﻣﺎن ﻓﻌﺎل ﺑﻮدن ﺳﯿﺴﺘﻢ، ﯾﮏ‬ ‫ﻣﻘﺪار ﺗﺼﺎدﻓﯽ در ﺧﺎﻧﻪ اول آراﯾﮥ ‪ HASH‬ﻗﺮار داده‬ ‫ﺷﺪه و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ‬ ‫)(‪ half_md4_transform‬اﯾﻦ ﻣﻘﺪار ﺑﺎز ﻫﻢ‬ ‫ﺗﺼﺎدﻓﯽ ﺗﺮ ﺷﺪه و ﺑﺎزﮔﺮداﻧﺪه ﻣﯽ ﺷﻮد‬
  • 30.
    ‫‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫ﺗﺎﺑﻊ )(‪ half_md4_transform‬ﮐﻪ در ﻓﺎﯾﻞِ ‪ lib/halfmd4.c‬ﺗﻌﺮﯾﻒ ﺷﺪه اﺳﺖ، ﯾﮏ‬ ‫-‬ ‫ﭘﯿﺎده ﺳﺎزي ﻣﺨﺘﺼﺮ از اﻟﮕﻮرﯾﺘﻢ 4‪ MD‬ﻣﯽ ﺑﺎﺷﺪ ﮐﻪ در ﺳﻪ دورِ 8 ﺗﺎﯾﯽ و ﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ‬ ‫ﻫﺎي ‪ XOR‬و ‪ AND‬اﯾﻦ اﻟﮕﻮرﯾﺘﻢ را ﺑﺮروي ورودي ﺧﻮد اﻋﻤﺎل ﻣﯽ ﻧﻤﺎﯾﺪ.‬
  • 31.
    ‫‪ ASLR‬در ﭘﺸﺘﻪ‬ ‫ﺑﺪﯾﻦ ﺗﺮﺗﯿﺐ ‪ ASLR‬در ﭘﺸﺘﻪ ﺑﺎ اﺳﺘﻔﺎده از 4 ﻣﻘﺪار اﺻﻠﯽ و ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ 4‪) MD‬ﯾﮏ ﭘﯿﺎده ﺳﺎزي‬ ‫-‬ ‫ﻣﺨﺘﺼﺮ از اﯾﻦ ﺗﺎﺑﻊ( اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬ ‫اﯾﻦ ﻣﻘﺎدﯾﺮ اﺻﻠﯽ ﻋﺒﺎرﺗﻨﺪ از:‬ ‫-‬ ‫ﺷﻤﺎره ﭘﺮوﺳﮥ اﺟﺮا ﺷﺪه.‬ ‫-‬ ‫ﺗﻌﺪاد ﺳﯿﮑﻞ ﻫﺎي ﭘﺮدازﻧﺪه.‬ ‫-‬ ‫ﻣﺪت زﻣﺎن روﺷﻦ ﺑﻮدن ﺳﯿﺴﺘﻢ.‬ ‫-‬ ‫اﯾﻦ ﭘﯿﺎده ﺳﺎزي اﺑﺘﺪاﯾﯽ ‪ ASLR‬در ﮐﺮﻧﻞ ﻟﯿﻨﻮﮐﺲ از ﻧﺴﺨﮥ 21.6.2 ﻗﺮار داده ﺷﺪ.‬ ‫-‬ ‫ﺑﻨﺎﺑﺮاﯾﻦ ﺑﺎ درﻧﻈﺮ ﮔﺮﻓﺘﻦ ‪ STACK_RND_MASK‬ﮐﻪ ﺑﺎ ﺧﺮوﺟﯽ ﻣﻘﺪار ﺗﺼﺎدﻓﯽِ ﺗﻮﻟﯿﺪ ﺷﺪه از ﻣﻮارد ﻓﻮق،‬ ‫-‬ ‫ﻣﺎﺳﮏ ﻣﯽ ﺷﻮد )ر.ك. ‪ ،(Binfmt_elf.c‬ﻣﯽ ﺗﻮان ﭼﻨﯿﻦ ﻧﺘﯿﺠﻪ ﮔﺮﻓﺖ ﮐﻪ ﺗﺼﺎدﻓﯽ ﺳﺎزي ﭘﺸﺘﻪ در ‪ِASLR‬‬ ‫ﭘﯿﺶ ﻓﺮض ﻟﯿﻨﻮﮐﺲ، ﺑﺮروي 11 ﺑﯿﺖ اﻧﺠﺎم ﺷﺪه و 7402 آدرس ﺗﺼﺎدﻓﯽ ﻣﺨﺘﻠﻒ ﺟﻬﺖ ﻗﺮار ﮔﯿﺮي ﭘﺸﺘﻪ‬ ‫ﺗﻮﻟﯿﺪ ﻣﯽ ﺷﻮد.‬
  • 32.
    ‫‪ ASLR‬در ‪heap‬‬ ‫اﯾﻦﭘﯿﺎده ﺳﺎزي ﻧﯿﺰ ﻫﻨﮕﺎم ﺑﺎرﮔﺰاري ﻓﺎﯾﻠﻬﺎي ﺑﺎﯾﻨﺮي اﻧﺠﺎم ﻣﯽ ﺷﻮد ﮐﻪ در ﻓﺎﯾﻞ ‪fs/binfmt_elf.c‬‬ ‫-‬ ‫ﻣﯽ ﺗﻮان ﺟﺰﺋﯿﺎت آن را ﻣﺸﺎﻫﺪه ﻧﻤﻮد.‬ ‫ﭘﺲ از ﭼﮏ ﮐﺮدنِ ﻓﻠﮓ ﻫﺎي ﭘﺮوﺳﻪ و ﺑﺮرﺳﯽ‬ ‫‪ ،PF_RANDOMIZE‬در ﺻﻮرﺗﯽ ﮐﻪ ﮔﺰﯾﻨﮥ‬ ‫‪ randomize_va_space‬ﻧﯿﺰ ﺗﻨﻈﯿﻢ ﺷﺪه ﺑﺎﺷﺪ،‬ ‫آدرس ﺷﺮوعِ ‪ ،heap‬ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊِ‬ ‫)(‪ arch_randomize_brk‬ﺗﺨﺼﯿﺺ داده ﺧﻮاﻫﺪ‬ ‫ﺷﺪ.‬
  • 33.
    ‫‪ ASLR‬در ‪heap‬‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ‪ heap‬در ﺗﺎﺑﻊ )(‪ arch_randomize_brk‬ﮐﻪ در ﻓﺎﯾﻞ‬ ‫-‬ ‫‪ arch/x86/kernel/process.c‬ﺗﻌﺮﯾﻒ ﺷﺪه، اﻧﺠﺎم ﻣﯽ ﭘﺬﯾﺮد:‬ ‫در اﯾﻦ ﺗﺎﺑﻊ از ﺗﺎﺑﻊِ ‪ randomize_range‬ﺑﻪ ﻣﻨﻈﻮر ﺗﺼﺎدﻓﯽ ﺳﺎزي آدرس ﺷﺮوع ‪heap‬‬ ‫اﺳﺘﻔﺎده ﻣﯽ ﺷﻮد.‬
  • 34.
    ‫‪ ASLR‬در ‪heap‬‬ ‫ﺗﺎﺑﻊ)(‪ randomize_range‬در ﻓﺎﯾﻞ ‪ drivers/char/random.c‬ﺗﻌﺮﯾﻒ ﺷﺪه و ﯾﮏ‬ ‫-‬ ‫آدرسِ ﺗﺼﺎدﻓﯽ ﺳﺎزي ﺷﺪه را ﺑﺮ ﻣﯽ ﮔﺮداﻧﺪ.‬ ‫در اﯾﻦ ﺗﺎﺑﻊ ﻧﯿﺰ ﻫﻤﺎﻧﻨﺪ ﺗﺼﺎدﻓﯽ ﺳﺎزي آدرس ﻫﺎي ﭘﺸﺘﻪ، از ‪ PAGE_ALIGN‬و‬ ‫)(‪ get_random_int‬اﺳﺘﻔﺎده ﺷﺪه ﮐﻪ در ﻧﺘﯿﺠﻪ ﯾﮏ آدرس ﺗﺼﺎدﻓﯽ ﺑﺮ ﻣﯽ ﮔﺮدد.‬
  • 35.
    ‫‪ ASLR‬در )(‪mmap‬‬ ‫ﺗﻨﻈﯿﻤﺎتﺗﺼﺎدﻓﯽ ﺳﺎزيِ ‪ mmap‬در ‪ ،ASLR‬ﺑﺴﺘﻪ ﺑﻪ ﭘﺮدازﻧﺪه ﻣﻮرد اﺳﺘﻔﺎده، در زﯾﺮﺷﺎﺧﮥ ﻣﺮﺑﻮﻃﻪ در‬ ‫-‬ ‫ﺷﺎﺧﮥ ‪ arch‬ﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ.‬ ‫ﺗﺎﺑﻊِ )(‪ arch_pick_mmap_layout‬ﺑﻪ ﻣﺤﺾ اﯾﺠﺎد ﺣﺎﻓﻈﮥ‬ ‫ﻣﺠﺎزي ﺑﺮاي ﻫﺮ ﭘﺮوﺳﻪ ﺻﺪا زده ﺷﺪه و ﺗﻨﻈﯿﻤﺎت ﻣﺮﺑﻮﻃﻪ را اﻧﺠﺎم‬ ‫ﺑﺴﺘﻪ ﺑﻪ ﺑﺮﺧﯽ ﻓﻠﮓ ﻫﺎ و ﭘﺎراﻣﺘﺮ‬ ‫ﻣﯽ دﻫﺪ‬ ‫ﻫﺎي ﭘﺮوﺳﮥ ﻓﺮاﺧﻮاﻧﺪه ﺷﺪه، اﯾﻦ‬ ‫ﺗﺎﺑﻊ، )(‪ mmap_legacy_base‬و‬ ‫ﯾﺎ )(‪ mmap_base‬را ﻓﺮاﺧﻮاﻧﯽ‬ ‫ﻣﯽ ﻧﻤﺎﯾﺪ.‬
  • 36.
    ‫‪ ASLR‬در )(‪mmap‬‬ ‫ﺗﺎﺑﻊﻓﻮق، ﺑﺎ ﺑﺮرﺳﯽ ﻓﻠﮓ‪ ‬ﺳﺎزﮔﺎري در ﻣﻮرد ﭘﺮوﺳﻪ و ﻫﻤﭽﻨﯿﻦ در ﺻﻮرﺗﯽ ﮐﻪ ﻣﺤﺪودﯾﺘﯽ در اﺳﺘﻔﺎده از‬ ‫ﻣﻨﺎﺑﻊ ﺑﺮاي اﯾﻦ ﭘﺮوﺳﻪ ﺗﻌﺮﯾﻒ ﻧﺸﺪه ﺑﺎﺷﺪ، ﭘﺮوﺳﮥ ﺟﺎري را ﺟﺰو ﭘﺮوﺳﻪ ﻫﺎي ﺟﺪﯾﺪ در ﻧﻈﺮ ﻣﯽ ﮔﯿﺮد ﮐﻪ‬ ‫ﻧﯿﺎزي ﺑﻪ رﻋﺎﯾﺖ ﭘﯿﺶ ﺳﺎزﮔﺎري )ﺟﻬﺖ ﺗﺼﺎدﻓﯽ ﺳﺎزي( ﻧﺨﻮاﻫﺪ داﺷﺖ.‬
  • 37.
    ‫‪ ASLR‬در )(‪mmap‬‬ ‫در ﺻﻮرت ﻓﺮاﺧﻮاﻧﯽ ﻫﺮﯾﮏ از اﯾﻦ ﺗﻮاﺑﻊ، در‬ ‫ﺻﻮرﺗﯽ ﮐﻪ ﺑﻨﺎ ﺑﻪ ﺗﺼﺎدﻓﯽ ﺳﺎزي آدرس ﻫﺎ‬ ‫ﺑﺎﺷﺪ، از ﺗﺎﺑﻊ )(‪ mmap_rnd‬ﺑﺮاي اﯾﻦ‬ ‫ﻣﻨﻈﻮر اﺳﺘﻔﺎده ﺧﻮاﻫﺪ ﺷﺪ.‬
  • 38.
    ‫‪ ASLR‬در )(‪mmap‬‬ ‫ﺗﺼﺎدﻓﯽﺳﺎزي ‪ ،mmap‬در ﺗﺎﺑﻊِ )(‪ mmap_rnd‬و ﺑﺎ ﻫﻤﺎن ﺗﮑﻨﯿﮏ ﻣﻮرد اﺳﺘﻔﺎده در ﺗﺼﺎدﻓﯽ ﺳﺎزي‬ ‫‪) Stack‬ﺗﮑﻨﯿﮏ )(‪ (get_random_int‬اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬ ‫ﺑﺮاي ﺳﯿﺴﺘﻢ ﻫﺎي 23 ﺑﯿﺘﯽ، 8 ﺑﯿﺖ ﺗﺼﺎدﻓﯽ ﺷﺪه و ﺑﺮاي ﺳﯿﺴﺘﻢ ﻫﺎي 46 ﺑﯿﺘﯽ، 82 ﺑﯿﺖ.‬
  • 39.
    ‫ﺟﻤﻊ ﺑﻨﺪي ‪ASLR‬‬ ‫‪ASLR‬در ﻟﯿﻨﻮﮐﺲ ﭘﯿﺎده ﺳﺎزي ﻫﺎي ﻣﺨﺘﻠﻔﯽ دارد ﮐﻪ در ﮐﻠﯿﻪ ﭘﯿﺎده ﺳﺎزي ﻫﺎ، ﻓﻀﺎي آدرس ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﻪ ﺻﻮرت‬ ‫-‬ ‫ﺗﺼﺎدﻓﯽ اﻧﺘﺨﺎب ﻣﯽ ﺷﻮد.‬ ‫در ﺻﻮرﺗﯽ ﮐﻪ ﻣﺴﺌﻮل ﺳﯿﺴﺘﻢ ﻗﺼﺪ اﺳﺘﻔﺎده از ﭘﯿﺎده ﺳﺎزي ﻫﺎي ﮐﺎﻣﻞ ﺗﺮ ‪ ASLR‬را داﺷﺘﻪ ﺑﺎﺷﺪ، ﻣﯽ ﺑﺎﯾﺴﺖ وﺻﻠﻪ‬ ‫-‬ ‫ﻫﺎي اﻣﻨﯿﺘﯽ اراﺋﻪ ﺷﺪه ﺗﻮﺳﻂ ﺷﺮﮐﺖ ﻫﺎﯾﯽ ﻧﻈﯿﺮ ‪ PaX‬را ﻧﺼﺐ ﻧﻤﺎﯾﺪ )ﮐﻪ در اﮐﺜﺮ ﻣﻮاﻗﻊ اﯾﻦ ﭼﻨﯿﻦ ﻧﯿﺴﺖ(.‬ ‫در ‪ ASLR‬ﭘﯿﺶ ﻓﺮض ﻟﯿﻨﻮﮐﺲ، آدرس ﺑﺎرﮔﺰاري ﭘﺸﺘﻪ، ‪ heap‬و ‪ mmap‬ﺗﺼﺎدﻓﯽ ﺳﺎزي ﻣﯽ ﺷﻮد.‬ ‫-‬ ‫ﺗﺼﺎدﻓﯽ ﺳﺎزي ﺑﺮ ﻣﺒﻨﺎي آدرس اوﻟﯿﻪ، زﻣﺎن روﺷﻦ ﺑﻮدن ﺳﯿﺴﺘﻢ، ﺗﻌﺪاد ﺳﯿﮑﻞ ﻫﺎي ﭘﺮدازﻧﺪه و ‪ PID‬ﭘﺮوﺳﻪ ﺟﺎري‬ ‫-‬ ‫اﻧﺠﺎم ﻣﯽ ﺷﻮد.‬ ‫ﺑﺮاي اﯾﻨﮑﻪ اﻃﻼﻋﺎت ﺑﻪ ﻣﯿﺰان ﺑﯿﺸﺘﺮي ﻏﯿﺮ ﻗﺎﺑﻞ ﭘﯿﺶ ﺑﯿﻨﯽ ﺑﺎﺷﺪ، از ﯾﮏ اﻟﮕﻮرﯾﺘﻢ ﻣﺨﺘﺼﺮ 4‪ MD‬ﻧﯿﺰ اﺳﺘﻔﺎده ﻣﯽ‬ ‫-‬ ‫ﺷﻮد.‬
  • 40.
    ‫ﺑﺎ ﺳﭙﺎس، ﻣﻨﺘﻈﺮدرﯾﺎﻓﺖ ﭘﯿﺸﻨﻬﺎدﻫﺎ و دﯾﺪﮔﺎه ﻫﺎي‬ ‫ﺷﻤﺎ درﺑﺎرة اﯾﻦ اﺳﻼﯾﺪ ﻫﺴﺘﻢ:‬ ‫‪Mohammad.golyani@gmail.com‬‬