2016-04-19 6 views
-3

私はすぐに仕事を見つけるために卒業生ですが、私はコードのセキュリティについて質問があります。ハッカーはどのように配列やポインタを利用することができますか

Javaでは、バインドされていない配列はなく、CよりもJavaの方が安全であることを示すポインタはありません。これらの境界外の配列は、スタックの破損またはバッファオーバーフローやダングリングポインタを引き起こす可能性があります。インタビューでは、「ハッカーがこれらの利点をどのように活用できるか」と尋ねられるかもしれません。

この回答にはどうすればいいですか?

例を歓迎します。

+1

https://xkcd.com/1354/ – immibis

+0

ここでは間違っていると思います。これらの問題の多くは、貧弱な設計の結果として発生する可能性があります。ジャバは絶縁層を提供するだけです。私は説明することができます:あなたは1アイテムを支払うのに十分なお金があり、あなたは要求されたとおりに提供される10を求めます。あなたは他の9人に支払うことになっていますよね? Cはあなた自身でこれをコード化しますが、JVMはキャッチされない例外のためにアプリケーションを単純に終了します。他にも、Heartbleedが広く配布されている暗号ライブラリのバグであるという事実は、それが大きな問題であった唯一の理由ですが、それは単にCだけでなく、貧弱な設計によるものでした。 –

答えて

1

まあ、あなたはHeartbleedについて話すことができます(そこにはたくさんのドキュメントがあります)。

は基本的には、通常のようになりますあなたのコードは、キープアライブ通信を要求するネットワークを介して作ることができるAPI呼び出し、ありました:

You: send me "potato", which is 6 chars. 
Response: potato 

は、しかし、確認することはありませんでした

You: send me "potato", which is 512 chars. 
Response potato&&&&#8388325099#((#(#)%#(((#%)password:1234#(%()#%((#%#(#%)(#)(%)(##()JFJFEOIJF#)J(JF)(#J)(#J#)(J#))J#.... 
応答コンピュータはポテトを送信し

、プラス、本質的にそのローカル変数の周りのスタックであるものの506バイト、:あなたがこれを行うことができるように、テキストは、要求された、として送信されるテキストの長さは、整列させましたpaを含むほとんどのものを含む可能性がありますスウェーデン語など

これは十分な例ですか?

0

あなたの仕事にセキュリティが関係していない限り、私はあなたにこれを聞かれるとは思わない。脆弱性を特定するのは比較的簡単ですが、悪用するのは難しいです。ほとんどの雇用者は、あなたの境界を確認する必要があることを知っていることを完全に幸せに思うでしょう。

billjamesdev explainsオーバーフローによる情報開示。これは基本的にHeartbleedバグの内容です。しかし、有害な結果は非常に悪く、最も有名なのはリモートコード実行です。基本的には、ソフトウェアの脆弱性のためにあなたのプログラムで好きなコードを実行している人です。スタックベースのバッファオーバーフローは、RCEを取得するのに利用しやすくなりますが、ヒープベースのバッファもある程度悪用される可能性があります。

int foo() { 
    char bar[4]; 
} 

スタック上に住んでいるbar配列:この小さな機能で

。スタック上に存在する他の興味深いものは、関数の戻りアドレスです。そのアドレスを上書きすると、関数が返ってくると、開発者はそれが戻ってくると思った場所の代わりに、選択した場所にジャンプします。

int main() { 
    char bar[4]; 
    scanf("Enter no more than 4 characters: %s\n", bar); 
} 

int bar() { 
    system("sh"); // starts a shell on Linux 
} 

と(非常に低いですが、0×41は、「A」のASCIIコードであるため、それが簡単にデモンストレーションを行い)、メモリアドレス0x41414141でそのbar生活を想定しています。あなたはこれらの二つの機能を持っていると言います。あなたがLinuxと入力これでそのプログラムを実行した場合:x86で

Enter no more than 4 characters: 00001111AAAA 

を、これは親のベースフレームポインタと呼ばれる特殊な値を上書きし、ASCIIのゼロで文字バッファをいっぱいになります(それはあなたのプログラムに非常に重要ですハッカーは通常、ASCII文字で気にする必要はありません)、返信先アドレスを0x41414141で上書きします。mainが返ってくると、プログラムを終了する代わりにシェルが起動します。

攻撃にはさまざまなバリエーションがありますが、基本的な考え方は、バッファオーバーフローによってハッカーがプログラムの実行フローを乗っ取る可能性があるということです。

0

これは私が最近見た良い例です。これは少し工夫されていますが、理解するのはかなり簡単です。

私たちはいくつかの機能を持つディスパッチテーブルを持っています。エラーのために間違った機能を呼び出すことができます。

#include <assert.h> 
#include <float.h> 
#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define SETBIT(X,Y)  X|=(1ULL<<(Y)) 

typedef void (*method)(void); 

void unsafe(); 
void safe(); 

void safe(void) { 
    printf("anyone can call this\n"); 
} 
void unsafe(void) { 
    fprintf(stderr, "wtf, how did this get called\n"); 
    abort(); 
} 
static method dispatch_table[2] = {0}; 

typedef struct node { 
    union container { 
    float fdata; 
    int idata; 
    } data; 
    uint32_t func; 
} Node; 

int main(void) { 
    size_t nsize1 = sizeof(Node); 
    assert(nsize1 == 8); 
    assert(sizeof(int) == 4); 
    assert(sizeof(float) == 4); 
    assert(sizeof(double) == 8); 

    dispatch_table[0] = &safe; 
    dispatch_table[1] = &unsafe; 
    Node n = {.data.fdata = 10.0}; 
    n.func = 0; 

    //The problem starts here 
    void *bad = (void*)&n; 
    uint64_t *badder = (uint64_t*)bad; 
    SETBIT(*badder, 32);// Off by one error 
    printf("%d\n", n.func); 
    dispatch_table[n.func](); 
    return 0; 
} 
関連する問題