【注意】このサイトに記載されていることを他人に試すことは「不正アクセス禁止法」に該当する場合があります。詳しくはこちらから

保護機構をやさしく理解するシリーズ。Partial RELRO と Full RELRO の違いをやさしく整理する(第7回/全10回)

黒ネコと学ぶ、保護機構をやさしく理解する

前回は、RELROが「書き換えられたくない大事な表を守る仕組み」であり、プログラムが外部の関数を呼ぶときに使う行き先情報を守りやすくする保護機構であることを学びました。
 
そこで次に出てくるのが、よく見かけるこの2つの言葉です。
・Partial RELRO(パーシャル・レルロー)
・Full RELRO(フル・レルロー)
 初めて見ると、
・何が、partialで、何が full なの?
・どちらもRELROなら、そんなに違うの?
・どこが強くて、どこが弱いの?
と迷いやすいと思います。
ですが、最初はとてもシンプルに考えて大丈夫です。
・Partial RELROは「ある程度守る形」
・Full RELROはより強く守る形」
です。
 
もちろん中にはもう少し細かい仕組みがあります。
でも、いきなり全部を覚えようとすると混乱しやすいので、今回はまず
・2つの違いの全体像。
・どちらが何をしやすく、何をしにくくするのか。
・どういう感覚で見ればよいのか。
を、やさしく整理していきます。
 ※イメージです。

まず結論:違いは「守りの強さ」

 最初に結論から言います。
「Partial RELRO」と「Full RELRO」の一番大きな違いは、守りの強さです。
どちらも「大事な表を守ろうとする」という方向は同じです。
ですが、守り方の厳しさに差があります。

白猫先生

簡単にたとえるなら、学校の大切な名簿を守るときに、Partial RELROは「名簿にカバーをかける」、Full RELROは「名簿にカバーをかけて、鍵付きの引き出しに入れる」という違いに近いです。

どちらも何もしないよりは安全です。
でも、より強く守られているのはFull RELROです。
 
ここで大事なのは、「RELROがある」だけではなく、「どの強さのRELROなのか」が重要だということです。
つまり、保護機構を見るときは、
・NXはあるか。
・Canaryはあるか。
・ASLR/PIEはどうか。
と同じように、
RELROはPartialなのか、Fullなのかまで見ることが大切になります。
 
 

Partial RELRO とは何か

 では、まずPartial RELROから見ていきましょう。
Partial RELROは、ざっくり言えば「一部の守りは入っているが、まだ完全ではない状態」です。
前回学んだように、プログラムの中には外部の関数へ進むための大事な表があります。
RELROはその表を守る方向で働きます。
 
ただし、Partial RELROでは、「守りが途中まで」というイメージで考えるとわかりやすいです。

白猫先生

簡単にたとえるなら、Partial RELROは「大事な表を机の上に置いたまま、透明カバーだけかけた状態」です。

これでホコリや軽い汚れからは守りやすくなります。
でも、机の上に出たままなら、まだ触ろうと思えば近づける感じがあります。
つまり Partial RELRO は、
・何も守られていないよりは良い。
・でも「かなり強い守り」とまでは言いにくい。
という立ち位置です。
 
まず「Partial RELRO = 途中まで守っている状態」と押さえれば十分です。
 
 

Full RELRO とは何か

 次に、Full RELROを見ていきましょう。
Full RELROは、ざっくり言えば「大事な表を、よりしっかり守る形」です。
 
Partial RELRO との違いをやさしく言えば、「守る範囲と守り方がより厳しい」ということです。

白猫先生

簡単にたとえるなら、Full RELROは「大事な表を、最初に必要な確認を全部済ませたあとで、鍵付きのケースに入れる状態」です。

これなら、あとからその表に勝手に手を加えるのがかなり難しくなります。
つまり Full RELRO は、
・大事な表を守る意識がより強い。
・書き換えにくさが高い。
・より堅い設定。
というイメージです。
 
ここで大切なのは、Full RELROは「何でも完全に安全」という意味ではないことです。
ただし少なくとも、Partial RELROよりも、書き換えられたくない表をしっかり守る方向に進んでいると理解するとわかりやすいです。
 
 

何が違って見えるのかをやさしく整理する

 ここで、Partial RELROとFull RELROの違いを、感覚で整理してみましょう。
Partial RELROのイメージは、
・守りは入っている。
・でも、まだ途中まで。
・「少し安心」ではあるが、「かなり堅い」とは言いにくい。
 
Full RELROのイメージ
・守りがより強い。
・後から手を加えにくい。
・「かなりしっかり守っている」と考えやすい。
この違いを、教室の名簿でたとえるとこうなります。
Partial RELROは、名簿にカバーはついている。でも先生の机の上に置かれていて、まだ手が届きやすい。
Full RELROは、名簿にカバーがつき、必要な確認も終わっていて、鍵付きの引き出しにしまわれている。あとから勝手に書き換えるのはかなり難しい。
 
技術的な細かい説明をいったん横に置くと、「あとから表をいじりにくいのはどちらか」で見ると、答えは、Full RELROです。
この感覚を持てると、"checksec"などで、Partial RELROやFull RELROという表示を見たときも、意味がぐっとつかみやすくなります。
 
 

サンプルコードと一緒に考える

 ここで、前回と同じく短いコードを見てみます。
-----
#include <stdio.h>
 
int main(void) {
    puts("Hello");
    return 0;
}
-----
このコードはとても短いですが、"puts()"という外部の関数を使っています。
つまりこのプログラムも、外の関数へ進むための情報に支えられています。
 
ここで考えたいのは、その「行き先情報の表」がどれくらい守られているかです。
もし、RELROが弱い、あるいは守りが途中までなら、その表は比較的やわらかい守りの中にあると考えられます。
一方で、Full RELROなら、表はより強く守られている方向になります。
このコード自体は単純ですが、学ぶべきことは重要です。
 
それは、外部関数を呼ぶだけの短いプログラムでも、その裏では「大事な表」が関わっていて、その守り方に差があるということです。
 
つまり、Partial RELROとFull RELROの違いは、派手な見た目の違いではありません。
プログラムの裏側で支えている「大事な表の守られ方の差」なのです。
 
 

保護機構をやさしく理解するシリーズ。Partial RELRO と Full RELRO の違いをやさしく整理するのまとめ

 今回学んだ大事なことは、Partial RELROとFull RELROの違いは「守りの強さ」にあるという点です。どちらも大事な表を守ろうとする保護機構ですが、Partial RELROは途中までの守り、Full RELROはよりしっかりした守りとして考えると理解しやすくなります。

白猫先生

簡単にたとえるなら、Partial RELRO は大事な名簿にカバーをかけた状態、Full RELRO はそれを鍵付きの引き出しにしまった状態です。

つまり、どちらも何もないより安全ですが、あとから勝手に手を加えにくいのは「Full RELRO」です。大切なのは、「RELROがあるかどうか」だけでなく、「Partialなのか、Fullなのか」まで見ることです。この感覚を持つことで、保護機構を“ある・ない”だけでなく、“どれくらい強く守っているか”という視点で見られるようになります。