Наколькі бяспечная «калі» заяву?

Незалежна ад мовы, я заўсёды збянтэжаныя канцэпцыі бяспекі праз , калі . Увесь код я пішу залежыць ад поспеху гэтай адной радкі з кодам <>, калі інструкцыі:

user = getUserName();
password = getPassword();

if (match(user, password)) {
    print secret information;
}

Так як гэта толькі адна лінія, якую я адчуваю, як сабатаж можа быць адносна проста. Ці магу я з выглядам рэчы, або адзін , калі на самой справе лепшы спосаб зрабіць гэта?

2
@Mikhail добра я ўкушу.
дададзена аўтар rook, крыніца
Я не думаю, што вы разумееце асновы secuirty. Яго сапраўды праблема псуты-х і ракавіны, а не ўмоўныя.
дададзена аўтар rook, крыніца
@Rook, гучыць, як у вас ёсць больш, каб сказаць .... апублікаваць рэальны адказ?
дададзена аўтар Mikhail, крыніца
@svick, у тым выпадку, калі вы згодныя, што маё пытанне мае сапраўдную заклапочанасць.
дададзена аўтар Mikhail, крыніца
Што GolezTrol было адзначыць, што вы можаце працаваць з дадзенымі, якія выкарыстоўваюцца ў кодзе, не маючы доступу да самога коду. Вэб-прыклады ўключаюць ін'екцыі SQL, або глабальныя зменныя
дададзена аўтар Mikhail, крыніца
@svick, вы камфортна думаць, што уліковы запіс абаронена адным радком з , калі заяву вашы зберажэнні?
дададзена аўтар Mikhail, крыніца
Не, я пытаюся пра атаку з боку.
дададзена аўтар Mikhail, крыніца
@Mikhail, я спадзяюся, што рахункі не абаронена ад адной лініі маіх зберажэнняў, а група людзей, якія разумеюць бяспеку глыбока і разгледзеў ўвесь адпаведны код.
дададзена аўтар svick, крыніца
@GolezTrol, акрамя выпадкаў, калі вы запусціце любое прыкладанне на вашым кампутары, вы маеце доступ да кода. Не крыніца ў мове было напісана ў, але зборка (або КСС, Java байт-код, ...) гэта код таксама.
дададзена аўтар svick, крыніца
І як зламыснік можа атакаваць ваш код, не маючы доступу да яго?
дададзена аўтар svick, крыніца
@svick Вам не патрэбен код для гэтага. Я мяркую, што вы чулі пра крэкінгу праграмнага забеспячэння, якое можа быць ўстаноўлена без рэгістрацыйнага ключа? Ну гэта, як гэта робіцца. Ніхто не меў фактычны код гэтага праграмнага забеспячэння.
дададзена аўтар GolezTrol, крыніца
Я думаю, вы павінны быць больш канкрэтнымі ў вашым пытанні. Калі зламыснік не мае доступу ні да зыходнага кода АБО скампіляванага кода, то зацвярджэнне само па сабе з'яўляецца «бяспечным». У сітуацыях, калі зламыснік мае доступ да сакрэтнай інфармацыі (напрыклад, калі ён мае сабранае прыкладанне, якое змяшчае сакрэтную інфармацыю), то калі Пастулаты ня бяспечна, вядома. Ён мог бы проста маніпуляваць скампіляванага прыкладання, каб абыйсці, калі заяву. У такой сітуацыі вы хацелі б, каб інфармацыя, якая будзе зашыфравана.
дададзена аўтар Anders Forsgren, крыніца
Я, напрыклад, мець такую ​​ж надзею, як @svick, але я не здзіўлюся, калі ў рэшце рэшт, пасля таго, як SSL і шыфравання і хэшавання і засолка і ахвяруючы казу, каб адлюстраваць благія тыя, хто нападаў, рашэнне Ці доступ на мой банкаўскі рахунак прадастаўляецца ці не рэалізаваны з выкарыстаннем , калі заяву, і гэтыя спецыялісты па праве лічаць усё гэта бяспечна. Я не думаю, што няма нічога асаблівага ў , калі - вы <я> павінен філіял <я> неяк па вызначэнні, гэта праз , калі , палімарфізм, або нават разумны ускосны скачок. Гэта пра тое, ці можна маніпуляваць сам (умова) рашэнне.
дададзена аўтар delnan, крыніца
"Sabotage"? Калі зламыснік мае доступ да зыходнага кода пісаць, вы screwed³ ў любым выпадку. Акрамя таго, што б быць альтэрнатывай? Прымусіць ўсю логіку настолькі заблытанай і заблытанай, што ні адзін зламыснік ня суправаджалы можа зразумець гэта? І нават тады, любы сур'ёзны зламыснік <я> будзе праца праз любыя схемы бяспекі заблытвання і складаныя - проста глядзець на пірацтва музыкі, фільмаў, відэагульняў і г.д.
дададзена аўтар delnan, крыніца

7 адказы

Вы маеце рацыю, элемент , калі , як гэта лёгка узламаны. Калі адзін рэверсіўных інжынераў гэта дадатак, вы можаце лёгка змяніць некалькі інструкцый, каб прапусціць , калі .

Ёсць розныя варыянты, такія як заблытвання выкананага файла або дадаючы больш складаныя праверкі і дадаць іх у розных месцах у вашым дадатку. Але ўсё, што вы робіце, ваша прыкладанне можа заўсёды быць узламаны.

Лепш за ўсё не турбавацца пра гэта. Да таго часу, ваша прыкладанне настолькі добра, і вялікі і шырока выкарыстоўваецца, што людзі на самай справе гатовыя прыкласці намаганні да парэпання, вы, верагодна, дастаткова грошай, каб абараніць яго лепш. Да таго часу, гэта не пустая трата часу, каб нават думаць пра гэта.

4
дададзена
Вельмі суцяшальна адказ. +1 і паляпванне па спіне
дададзена аўтар Mikhail, крыніца

Там адна рэч, пра тое, што IF часта забываюць. Гэта называецца атака сінхранізацыі. Выкажам здагадку, у вас ёсць вэб-дадатак, якое параўнання, заснаваны на непасрэдным узгадненні пароля адпраўленага з паролем, захаваным у БД (так, я ведаю, што ніхто ў сваім розуме не будзе захоўваць паролі ў БД, але, як сказаў Cheshire Cat, «мы ўсё з розуму тут "). Затым працэдура параўнання займае розны час у залежнасці ад гэтага ці паролі не супадаюць на першы знак, на другім ці на апошнім. Хоць гэта можа здацца, што розніца ў часе вельмі малая, гэта дастаткова для атакавалага, каб паспрабаваць адгадаць пароль, нават праз інтэрнэт, не кажучы аб лакальным аналізе. Часовая атака з'яўляецца трохі больш складаным, чым я апісаў, але ўвогуле, калі параўнанне не 100% бяспечна, па меншай меры, не ва ўсіх выпадках.

2
дададзена
@Mikhail затрымка павінна быць выпадковай. Пастаянная затрымка не дадае бяспекі для процідзеяння такіх нападаў. Замест таго часу X вы проста атрымаеце X + 4000.
дададзена аўтар Eugene Mayevski 'Allied Bi, крыніца
@Mikhail Я баюся, што гэта больш дастасавальна, чым можна было б падумаў. гэта значыць гэта не толькі тэарэтычны.
дададзена аўтар Eugene Mayevski 'Allied Bi, крыніца
О, я разумею :) я ўяўляў выпадкі, калі я мог прымяніць яго сёння. На маім сэрвэры, калі ёсць неадпаведнасць карыстальніка/пропуск I выдае секундную затрымку 4
дададзена аўтар Mikhail, крыніца
Ніколі не думаў пра гэта :) Не зусім дастасавальна ў любым месцы я магу выявы, але добры трук, каб мець у кішэні
дададзена аўтар Mikhail, крыніца

Калі зацвярджэнне абсалютна бяспечна, і ніколі не можа быць прычынай уразлівасці. Уразлівасці ўзнікаюць з амаль усё астатняе ў вашым кодзе.

Цалкам магчыма, што аператар параўнання, які вы выкарыстоўваеце недахопы. Так, напрыклад клавішы == аператар выкарыстоўвае ўзгадненне фаззинга, дзе дыяпазон магчымых значэнняў прымаюцца. Гэта не можа быць добра для secuirty, але яго цяжка прыдумаць добры прыклад, гэта на самай справе не мае значэння для пароля. Просты $ пароль == $ _ GET [ 'пароль'] павінен працаваць нармальна.

Ваш калі заява таксама можа спадзявацца на дрэннае рэгулярны выраз, такіх як

if(preg_match('/(.+)\\.js/'.$_GET['file'])){
    readfile($_GET['file']);
}

У гэтым выпадку рэгулярны выраз шукае .js ў любым месцы радка, а не выкананне яго, каб быць у канцы.

?file=../../.js/../../../../../../../etc/passwd

(І гэтая ўразлівасць выйграла мне 3000 $ у праграме памылкі шчадротаў Mozilla;)

Я памятаю такога роду узломаў. Я, здаецца, абыйсці іх з дапамогай Хэшаў або РНР Realpath . Дзякуй тым не менш
дададзена аўтар Mikhail, крыніца

У канкрэтным выпадку, вы паказваеце, калі вы сапраўды турбуецеся аб неаўтарызаваных людзей, якія бачаць сакрэтны выснова інфармацыі на «друк сакрэтнай інфармацыі;" Вы б зашыфраваць «сакрэтную інфармацыю» з дапамогай прыкладаемага пароля. Гэта гарантавала б, што толькі чалавек, які быў у стане забяспечыць належны пароль будзе мець магчымасць убачыць сакрэтную інфармацыю.

2
дададзена
+1, таму што ён звярнуўся да майго дакладнаму турботы пра сілу , калі
дададзена аўтар Mikhail, крыніца

Калі гэта серверны код - гэта не праблема, да таго часу, пакуль вы захоўваеце бяспечны сервер.

Калі гэта код кліента - вы маеце рацыю. Хтосьці можа маніпуляваць код - альбо двайковы файл або вобраз памяці (пасля загрузкі). Аднак, гэта дакладна для любога кліенцкага прыкладання. Вы можаце зрабіць толькі гэта цяжэй (выкарыстоўваючы такія інструменты, як PECompact + Анты-адладжваць убудова , напрыклад), але вы не можаце дасягнуць вельмі высокі ўзровень бяспекі.

1
дададзена
Не чулі гэтыя інструменты. дзякуй
дададзена аўтар Mikhail, крыніца

Там няма нічога няўпэўнены адной лініі з , калі ў ім.

Калі код выконваецца на сэрвэры, важна тое, наколькі бяспечна, што сервер. Калі прырост хакерскія да яго доступ, гэта не мае значэння, наколькі складаным ваш код, ён зможа абысці яго.

Сапраўды гэтак жа, калі ваш код працуе на кампутары патэнцыйнага зламысніка (напрыклад, камп'ютэрнай гульні, якія вы хочаце абараніць), няма нічога, што вы можаце зрабіць, каб спыніць зламысніка. Вы можаце зрабіць яго працу крыху больш складана, але гэта ўсё.

Вы не павінны турбавацца аб бяспецы адной лініі, але сістэмы ў цэлым. Калі вы зробіце ваш код больш складаным, усё, што вы зрабілі гэта ўвесці больш магчымасцяў для памылак. Выкарыстанне больш складанага кода з'яўляецца спроба бяспекі праз невядомасць, якая не працуе.

Калі вы не можаце давяраць свайму кампутара выконваць просты , калі правільна, вы не можаце давяраць яму наогул.

0
дададзена

Я не ўпэўнены, каб зразумець ваша пытанне.

метады абароны праграмнага забеспячэння недасканалыя, і AFAIK Яны загадзя выкажам здагадку, некалькі памылак у кампілятары, і «ідэальны» жалеза (гэта значыць працэсар правільна інтэрпрэтаваць машынны код).

Я не знаёмы (але цікава) з падыходамі да недасканалым апаратных сродках (за выключэннем, вядома, з дапамогай надмернасці або іншых метадаў, напрыклад, ECC для пошуку абсталявання памылак).

0
дададзена