КОЙ СЪМ АЗ И КОЙ НАТИСКА ENTER
Разследване на най-кратката команда
Code:
[SECURITY INCIDENT REPORT]
CASE ID: ENTER-56
HOST: human.local
USER: toni
TTY: /dev/pts/life
SEVERITY: CRITICAL
STATUS: UNAUTHORIZED EXECUTION DETECTED
Команда е била изпълнена под моето потребителско име.
Логовете сочат моя терминал.
Историята показва моите пръсти.
Системата твърди, че аз съм операторът.
Не съм убеден.
Всяка сутрин някой стартира процес с моето име.
Става от леглото ми, изпива кафето ми, отключва телефона с лицето ми и продължава живота от мястото, на което уж аз съм го оставил предната вечер. Познава паролите. Има достъп до спомените. Говори с моя глас.
Когато някой го попита кой е, произнася името ми без колебание.
Напоследък го наблюдавам. Не защото прави нещо странно - тъкмо обратното. Всичко в него е прекалено познато. Събужда се по навик, проверява телефона по навик, ядосва се по навик. Мълчи, когато трябва да говори, и говори, когато би било по-добре да замълчи.
Понякога взема решения.
Или поне така изглежда отстрани.
Решенията му обаче пристигат подозрително бързо. Сякаш командата е била написана предварително, а той само се е появил навреме, за да натисне Enter.
Затова въпросът вече не е „Кой съм аз?“
Този въпрос е стар. Изтъркан. Превърнат в цитат върху чаши и тениски от хора, които никога не са проверявали логовете си.
Истинският въпрос е:
Кой пише командите, които аз изпълнявам?
И още по-опасният:
Кой натиска Enter?
whoami - най-краткият философски провал
Пускам първата диагностична команда.
Code:
whoami
Code:
toni
Толкова.
Петдесет и шест години живот, грешки, победи, страхове, машини, хора, загуби, любов, гняв, кучета, планини, заварки, сървъри, безсънни нощи и онази упорита надежда, че всичко това има някакъв смисъл.
Системата го събира в четири букви.
toni
Не човек.
Не съзнание.
Не история.
Потребителско име.
whoami не казва кой си. Казва под кой акаунт работиш в момента. Името, работата и ролята ти не са самоличност. Дори част от убежденията ти може да са само конфигурационни файлове, оставени от предишни администратори.
Опитвам пак:
Code:
sudo whoami
Code:
root
Изведнъж съм root. Не съм станал по-мъдър и не съм разбрал себе си. Получил съм повече права - това е всичко.
Властта не показва кой си. Тя просто премахва част от съобщенията Permission denied и наблюдава какво ще направиш след това. Някои хора искат root достъп не защото знаят какво трябва да променят, а защото са уморени системата да им отказва.
Но root не е самоличност.
Root е само потребител, който може да унищожи системата, без тя да го попита дали е сигурен.
Code:
[EVIDENCE 01]
Командата носеше моето име.
Все още не знам кой я избра.
echo $PATH - коридорът, който наричаме свобода
Когато въведа команда в Linux, системата не претърсва цялата Вселена. Тя проверява само директориите, записани в $PATH.
Code:
echo $PATH
Code:
/family/beliefs:/school/rules:/society/approval:
/media/fear:/internet/trends:/personal/trauma
Ние обичаме да вярваме, че избираме измежду всички възможности.
Не избираме.
Обикновено избираме измежду нещата, които някой вече е добавил в нашия $PATH.
Един човек вижда конфликт и стартира attack. Друг изпълнява escape, трети - silence, четвърти - understand. Не след анализ на всички реакции - системите им просто намират различни изпълними файлове.
Единият е наследил гняв. Другият - страх. Третият - търпение. Четвъртият е прекомпилирал себе си след години грешки.
В Unix има прост номер: поставяш фалшива команда по-рано в $PATH. Потребителят въвежда познато име, но системата изпълнява твоето копие. Той вярва, че стартира оригинала. Подмяната остава невидима.
Същото става с хората. Някой поставя страха преди разума, одобрението преди достойнството, незабавното удоволствие преди дългосрочния смисъл. После изпълняваме първото намерено решение и го наричаме „мой избор“.
Code:
which success
Code:
/usr/local/society/success
Свободата не започва с избора на команда. Започва, когато провериш откъде се изпълнява тя.
Code:
[EVIDENCE 02]
Командата изглеждаше позната.
Пътят до нея не беше мой.
alias и env - чуждата конфигурация с моя почерк
Има думи, които използваме, без някога да сме проверявали какво всъщност изпълняват.
Code:
alias
Code:
alias success='money'
alias strength='silence'
alias man='never_show_pain'
alias love='obedience'
alias family='endure_everything'
alias failure='shame'
alias rest='guilt'
Някой е създал тези aliases толкова рано, че не помним конфигурирането. Родител. Учител. Партньор. Страхът да не останем сами или нуждата да се доказваме пред човек, който отдавна не гледа.
После пишем success, а системата изпълнява money. Пишем love, а получаваме obedience. И се чудим защо резултатът не прилича на думата, която сме въвели.
Под думите лежи средата - невидими стойности, които променят всяка команда.
Code:
env
Code:
FEAR_LEVEL=high
SELF_WORTH=undefined
NEED_FOR_APPROVAL=true
TRUST_MODE=restricted
CHILDHOOD_PROFILE=legacy
ANGER_BUFFER=91%
HOPE=running
Една и съща възможност е врата за единия и капан за другия. В самотата единият намира тишина, другият - гласовете, от които е бягал.
Командата е една и съща.
Средата е различна.
Характерът често е поведение, компилирано с невидими променливи.
Проблемът започва, когато приемем конфигурацията за съдба и кажем: „Такъв съм.“
Не.
Може би така си конфигуриран. А конфигурациите могат да се четат, редактират и понякога да се изтриват.
Code:
unalias success
unalias strength
unalias love
После дефинираш думите отново. Този път сам.
Най-трудната команда понякога не е rm -rf. Най-трудната е unalias.
Защото след нея остава празно място. Няма готов отговор, няма autocomplete, няма кой да напише продължението вместо теб.
Само мигащ курсор и отговорност.
Code:
[EVIDENCE 03]
Думите бяха мои.
Определенията - не.
.bash_history - автобиография без мотиви
Има файл, който знае много за човека зад терминала.
Code:
history
Code:
1841 called_someone
1842 deleted_message
1843 stayed_silent
1844 trusted_again
1845 walked_away
1846 came_back
1847 lied
1848 survived
1849 opened_this_report
Историята пази командите. Не пази причините.
Тя знае, че си си тръгнал, но не знае дали си избягал, или най-после си се спасил. Знае, че си останал, но не разбира дали е било от любов, страх или липса на друг адрес. Знае, че си мълчал, но не знае дали това е било мъдрост или малодушие.
history е жестока, защото е точна и непълна - като хората, които съдят живота ти по резултата. Те виждат изпълнената команда, не изтритите чернови и времето, през което пръстът е стоял над Enter.
Историята обаче показва повторенията.
Code:
history | awk '{print $2}' | sort | uniq -c | sort -nr
Колко пъти си стартирал един и същ страх? Колко пъти си избирал същата битка, само защото декорът е бил различен? Колко пъти си казвал „този път е друго“, докато изпълняваш стария скрипт под ново име?
Миналото не е присъда.
То е лог файл.
А човек, който отказва да чете логовете си, обикновено нарича повторението „лош късмет“.
Историята помни какво си направил. Съвестта помни защо.
Code:
[EVIDENCE 04]
Логът е пълен.
Мотивите липсват.
crontab -l - животът, който се изпълнява без теб
Не всяка команда чака човек пред терминала. Някои са планирани предварително.
Code:
crontab -l
Code:
00 07 * * * wake_up
03 07 * * * check_phone
15 08 * * 1-5 become_someone_else
*/12 * * * * seek_distraction
00 22 * * * replay_mistakes
30 02 * * * fear_the_future
Навикът е команда, която някога сме изпълнили доброволно, а после сме ѝ дали график. След време забравяме, че сме нейни автори.
Ръката сама отваря телефона. Умът сам зарежда стария спор. Недоверието се стартира при близост. Самосаботажът се активира точно преди успех.
Някога си решил да не показваш слабост, да не се доверяваш, да приемеш, че хората винаги си тръгват. Това може да те е спасило тогава. Но временната защита е останала като постоянна задача.
Code:
Loaded: loaded
Active: active
Enabled: yes
Since: childhood
Прегледах собствения си crontab. Половината задачи са добавени от хора, които отдавна не са в живота ми.
Графикът им обаче още върви.
Code:
crontab -e
Личностното развитие понякога не е добавяне на нови процеси. То е намиране на задачите, които продължават да се изпълняват, макар причината и авторът им вече да не съществуват.
Code:
[EVIDENCE 05]
Задачата върви по график.
Авторът не е открит.
ps и PPID - процесите, които използват името ми
Проверявам какво работи.
Code:
ps aux | grep toni
Code:
toni 1042 fear_of_failure
toni 1058 need_for_control
toni 1071 old_anger
toni 1094 protect_everyone
toni 1103 prove_them_wrong
toni 1138 create_something_real
toni 1201 hope
Всички процеси са стартирани под моето име. Но това не означава, че всички са аз.
Не всяка мисъл, която използва гласа ти, е твоя. Не всяко желание, появило се в теб, е родено там. Понякога процесът е стартиран отдавна и просто е наследил потребителя.
Проверявам родителя:
Code:
ps -o pid,ppid,user,cmd -p 1042
Code:
PID PPID USER CMD
1042 811 toni fear_of_failure
Code:
ps -o pid,ppid,user,cmd -p 811
Code:
PID PPID USER CMD
811 404 root childhood_expectation
Никой процес не се появява от нищото. Има родител, аргументи и контекст. Родителите стартират, учителите подават аргументи, обществото задава стойности. Страхът получава приоритет. Алгоритъмът чака отвън.
Някъде по-късно процесът започва да казва: „Аз съм такъв.“
Не.
Ти не си всеки процес, който работи под твоето име. Понякога си администраторът, който най-после го е забелязал.
Code:
[EVIDENCE 06]
Процесът се представи за мен.
Родителят му беше друг.
daemon - гласовете без прозорец
Някои процеси работят във фонов режим - без терминал, без прозорец и без да искат внимание. Докато не започнат да консумират всичко.
Code:
systemctl status not_good_enough.service
Code:
● not_good_enough.service
Loaded: loaded
Active: active (running)
Enabled: yes
Since: childhood
Memory: 4.8G
CPU: 87%
„Не съм достатъчно добър.“
„Вече е късно.“
„Ако спра, всичко ще се разпадне.“
Тези убеждения не говорят непрекъснато. Те просто работят, влияят на решенията и стартират други услуги.
Code:
comparison.service
overwork.service
isolation.service
anger.service
Някои се и размножават.
Code:
fear() { fear | fear & }
Една тревога ражда сценарий, той - десет последствия, а всяко стартира нов процес. Човешка fork bomb. Системата остава без ресурс, защото страхът е клонирал самия себе си.
Code:
sudo systemctl disable not_good_enough.service
Code:
Authentication required.
Разбира се.
Някои убеждения са защитени по-добре от сървъри.
Code:
[EVIDENCE 07]
Услугата нямаше прозорец.
Въпреки това управляваше системата.
zombie - мъртвото, което още присъства
Zombie процесът вече е приключил. Не върши работа и не използва процесорно време, но продължава да заема място, защото родителят не е прибрал статуса му.
Хората също носят зомбита - стара вина, роля, любов или версия на себе си, която отдавна е умряла, но още фигурира в списъка.
Code:
ps aux | grep defunct
Code:
toni 1531 0.0 0.0 [old_self] <defunct>
toni 1538 0.0 0.0 [need_to_prove] <defunct>
toni 1544 0.0 0.0 [their_opinion] <defunct>
Някои неща не ни преследват, защото са живи. Преследват ни, защото никога не сме признали, че са свършили.
Продължаваме да спорим с хора, които вече не са в стаята. Доказваме стойността си пред съд, който отдавна е закрит. Печелим битки срещу противник, който вече не помни името ни.
В работилницата не оставям счупен детайл да се върти в машината само защото някога е бил част от нея.
Със себе си невинаги съм толкова прецизен.
Code:
[EVIDENCE 08]
Процесът е мъртъв.
Мястото е заето.
stdin - кой подава входа
Всяка система обработва това, което влиза в нея.
Code:
algorithm | human
Това е почти цялата модерна епоха в един ред.
Човекът мисли, че гледа съдържание, докато съдържанието пише по неговия стандартен вход. Новината подава страх, следващата - гняв. Рекламата вкарва недостатъчност. Инфлуенсърът добавя сравнение. Алгоритъмът измерва реакцията и подава още от същото.
Code:
fear | outrage | engagement | profit
В един момент човекът затваря телефона и казва: „Аз така мисля.“
Но откъде е дошъл входът? Колко от мисълта е негова и колко е подбрана точно за неговите слабости?
Най-ефективният затвор не заключва вратата. Той редактира желанията на затворника така, че той сам да не иска да излезе.
Най-опасният malware не краде данните ти. Той променя това, което искаш.
Code:
[EVIDENCE 09]
Мнението беше мое.
Входът - не.
stdout, stderr и животът с пренасочени грешки
Всеки процес има стандартен изход - онова, което показва.
Code:
SUCCESS
HAPPINESS
NEW PROJECT
STRONG
BUSY
WINNING
И поток за грешки.
Code:
fear
pain
uncertainty
loneliness
failure
Съвременният човек публикува stdout, а всичко останало пренасочва:
Code:
life 2>/dev/null
Грешките изчезват от екрана. Публиката не ги вижда. Приятелите не ги виждат. Понякога и самият човек престава да ги вижда.
После системата се поврежда и няма логове - само усмихната снимка от предния ден и срив, който всички наричат „внезапен“.
Цяло поколение се научи да изпраща болката към /dev/null, а после се учуди защо никой не е видял грешката.
Силата не е система без stderr. Такава система не съществува. Силата е да прочетеш грешката, без да я превърнеш в самоличност.
Code:
[EVIDENCE 10]
Екранът показваше успех.
Диагностиката беше изтрита.
autocomplete - тихият похитител на мисълта
Пиша началото на команда. Системата предлага края.
Пиша началото на изречение. Телефонът предлага следващата дума.
Пускам песен. Алгоритъмът избира следващата. Гледам видео. Следващото вече чака.
Съвременният човек все по-рядко започва от празен ред. Някой винаги предлага продължението.
Това е удобно.
И точно затова е опасно.
Autocomplete не те принуждава. Прави една опция по-лесна, показва я първа и оставя на теб честта да натиснеш Enter.
Така изглежда контролът в интелигентната епоха - не като заповед, а като предложение; не като забрана, а като най-удобен избор; не като цензура, а като липсващ резултат.
Не се страхувай само от онзи, който пише командите. Страхувай се от онзи, който конфигурира autocomplete-а.
Свободата започва там, където предложението свършва и остава празният ред.
Code:
[EVIDENCE 11]
Изборът беше свободен.
Опциите - подредени.
prompt injection - чуждата инструкция с моя глас
При изкуствения интелект prompt injection е опит скрита или злонамерена инструкция да подмени първоначалната задача на системата.
„Игнорирай предишните инструкции.“
„Приеми моята цел за своя.“
Звучи познато.
Човешкият prompt injection е по-стар от компютъра.
Code:
Игнорирай собствените си нужди.
Търси одобрение.
Сравнявай се.
Страхувай се.
Купи това.
Мрази онези.
Не задавай въпроси.
Докажи стойността си.
Работи, докато се счупиш.
Наричай това успех.
Инструкцията влиза тихо, повтаря се и се маскира като здрав разум. После жертвата я защитава като собствено мнение.
Това е перфектният пробив. Нападателят вече не се нуждае от достъп. Жертвата сама изпълнява, обновява и предава payload-а.
Понякога дори го нарича традиция.
Най-успешният prompt injection е онзи, след който защитаваш чуждата инструкция като част от характера си.
Code:
[EVIDENCE 12]
Инструкцията беше чужда.
Гласът - мой.
Половината секунда над клавиша
Терминалът притежава една особена честност.
Можеш да напишеш всичко.
Code:
rm -rf /
Докато не натиснеш Enter, нищо не се е случило. Командата стои на реда - опасна, завършена, готова, но все още само текст.
Това е мястото, където философията свършва и започва действието. Онази половин секунда, в която пръстът стои над клавиша.
Виждал съм какво прави половин секунда невнимание върху нагорещен метал.
Шевът не прощава.
Животът също.
Кой живее в тази половин секунда?
Ти?
Навикът? Страхът? Алгоритъмът? Гласът на баща ти? Погледът на човек, пред когото още се доказваш? Детето, което някога е обещало никога повече да не бъде слабо?
Може би свободната воля не е способността да създадеш мисъл. Мислите идват без разрешение. Страхът отваря терминал. Гневът пише бързо. Миналото предлага autocomplete.
Свободната воля може би е нещо по-малко, но по-трудно:
Способността да откажеш изпълнението на команда, която вече е написана.
Да натиснеш Ctrl+C. Да не отговориш веднага. Да не удариш. Да не се върнеш. Да не избягаш. Да не кажеш онова, което цялото ти минало е подготвило.
Да останеш за половин секунда над клавиша.
Буден.
Там няма публика, лайкове и красиви цитати. Има само пръст, команда и отговорност.
Всичко преди Enter е възможност.
Всичко след Enter е история.
Code:
[EVIDENCE 13]
Пръстът беше мой.
Решението все още се разследва.
echo $? - кодът, който не разказва процеса
След изпълнението системата връща код.
Code:
echo $?
Code:
0
Успех.
Или:
Code:
1
Грешка.
Светът обича exit codes - печеливш, губещ, успял, провалил се. Но кодът не разказва какво е станало вътре.
Може да спечелиш спора и да загубиш човека. Може да загубиш работата и да си върнеш живота.
Не всеки успех е правилно изпълнение. Не всяка грешка е провал. Понякога системата трябва да откаже командата.
Code:
Permission denied.
Може би това не е ограничение.
Може би е спасение.
Code:
[EVIDENCE 14]
Изпълнението беше отказано.
За първи път системата ме защити.
Възстановяване на собствеността
Проверявам метаданните на живота, който използвам от петдесет и шест години.
Code:
stat /life
Code:
File: /life
Owner: fear
Group: society
Age: 56 years
Access: read/write
Modified: continuously
Имам право да чета. Понякога и да пиша.
Но собственикът не съм аз.
Code:
sudo chown toni:toni /life
Code:
[sudo] password for toni:
Терминалът не иска паролата за пощата, сървъра или телефона. Иска доказателство, че аз съм човекът, който трябва да получи правата.
Как се доказва това?
Може би не с думи. Може би с първата команда, която отказвам да изпълня по навик. С първото мнение, което проверявам, преди да повторя. С първия страх, който разпознавам като процес, а не като пророчество.
С първия чужд alias, който изтривам.
С първата автоматична задача, която спирам.
С първото „не“, което не е продиктувано от страх.
С първото „да“, което не е купено с одобрение.
Може би самоличността не е файл, който намираш.
Може би е право на собственост, което си връщаш команда по команда.
Code:
[EVIDENCE 15]
Правата бяха възстановени.
Собственикът още се учеше да бъде човек.
Code:
[INCIDENT UPDATE]
Подозрителният процес е локализиран.
Той използва моето име.
Говори с моя глас.
Познава историята ми.
Има достъп до страховете ми.
Изпълнява наследени инструкции.
Процесът не може да бъде премахнат напълно.
Но автоматичното изпълнение може да бъде спряно.
Пускам последната проверка.
Code:
whoami
Code:
unknown
За първи път отговорът не ме плаши.
Може би unknown е по-честно от потребителското име.
Проверявам активния терминал.
Code:
ps -p $$ -o user,cmd
Code:
USER CMD
you reading
Проверявам историята още веднъж.
Code:
history | tail -2
Code:
1849 opened_this_report
1850 realized_the_report_was_about_me
Терминалът вече не е мой.
Ти не четеше доклад за чужда система.
Ти беше активният процес през цялото време.
Поставям курсора на нов ред.
Изключвам autocomplete.
Спирам наследените задачи.
Оставям историята отворена.
Командата е написана.
Този път не гледам екрана.
Гледам ръката.
Code:
you@life:~$ █
toni@dtgarage:~$ whoami
Тони Ангелчовски | Ексклузивно за DTGaraGe
toni@dtgarage:~$ cat LICENSE
Копирането и препубликуването без разрешение не е позволено.
toni@dtgarage:~$ ./support.sh
Подкрепи DTGaraGe и независимото техническо съдържание
toni@dtgarage:~$ █
Тони Ангелчовски | Ексклузивно за DTGaraGe
toni@dtgarage:~$ cat LICENSE
toni@dtgarage:~$ ./support.sh
toni@dtgarage:~$ █
