Forwarded from Generative Anton
Нашел золото: перевод слова "Нет" на офисный булшит.
Избранное (жизненное):
- Interesting idea, let's explore that next quarter
- What problem are we trying to solve?
- Let’s gather more data before moving forward
- Let’s keep this in mind for future consideration
Избранное (жизненное):
- Interesting idea, let's explore that next quarter
- What problem are we trying to solve?
- Let’s gather more data before moving forward
- Let’s keep this in mind for future consideration
Letsnotdothat
Master the Art of the Product Manager 'No'
Keep your meetings smooth and your priorities on track!
👍7😁4❤🔥2💯2🤡1
Forwarded from Install Wizard
В калькуляторе Windows 11 есть построение графиков а-ля Desmos.
Я даже не могу затянуть старую песню про bloatware, это неиронично круто.
Я даже не могу затянуть старую песню про bloatware, это неиронично круто.
🤔4❤3🔥1😁1😱1💯1😐1
#rustforlinux #suckassstory
TL:DR: Тем временем в Linux одинактивный долбоёб мейнтейнер Christoph Hellwig активно мешает #Rust for Linux.
DMA (Direct memory access) — технология, предоставляющая (относительно) прямой доступ к RAM для периферии. Это позволяет процессору управлять IO с устройствами асинхронно, не блокируясь на каждую операцию ввода-вывода. Использование DMA позволяет серьёзно повысить быстродействие системы в целом, а для, скажем, видеокарт и сетевых карт это и вовсе практически обязательная вещь из-за объёма обмениваемых данных.
Разумеется, в Linux есть свой API для DMA. По понятным причинам его используют практически все драйвера. Для того, чтобы сделать Rust for Linux практичным, нужно предоставить доступ к DMA для кода на Rust, и соответствующий патч от 8 января 2025 года именно это и делает. В нём добавляется минимально необходимый для использования код: RAII-обёртка над выделенными регионами памяти, операции для записи и небезопасная операция для чтения (почему unsafe? Потому что соответствующий метод read предоставляет доступ к выделенной памяти, как неизменяемый растовый слайс, и это пользователю API нужно удостовериться, что, пока слайс жив, железо не меняет данные под слайсом и тем самым не вносит UB).
Первым же ответом от Кристофа Хэллвига — человека, который отвечает за DMA в Linux — было "No rust code in kernel/dma, please". Да, это ответ целиком. Эта претензия абсолютно необоснована — достаточно взглянуть на первые строчки diff-а, чтобы понять, что меняется лишь растовый код, а не сишный в kernel/dma.
Последующий тред показал, что Кристоф абсолютно против существования растовой абстракции над DMA в любом виде, причём без предоставления внятных технических аргументов.
Скажем, вот как диалог пошёл после первого ответа:
(Miguel Ojeda): > What do you suggest?
> Keep the wrappers in your code instead of making life painful for others.
(Danilo Krummrich): > What does "your code" mean? Duplicated in every driver? Otherwise rust/kernel/dma.rs seems reasonable, no?
> Yes, interfaces to the DMA API should stay in readable C code and not in weird bindings so that it reminds greppable and maintainable.
Последующий обмен сообщениями показал, что Кристоф, судя по всему, считает, что этот код делает Linux многоязычным и потому автоматически плохим. Замечания от мейнтейнеров R4L о том, что никто не ожидает от Кристофа, что он будет заниматься поддержкой растового кода, ни к чему не привели. Сообщения Кристофа содержали такие занимательные цитаты:
(link)
(link)
(link)
Для понимания масштаба неадекватности претензий: R4L уже существует довольно продолжительное время, причём в транке, по понятным причинам там уже есть приличное количество абстракций над API ядра, а патч, с которого и начался весь сыр-бор, оборачивает один (1) сишный тип, две (2) сишные функции и пачку связанных с этими функциями флагов.
TL:DR: Тем временем в Linux один
DMA (Direct memory access) — технология, предоставляющая (относительно) прямой доступ к RAM для периферии. Это позволяет процессору управлять IO с устройствами асинхронно, не блокируясь на каждую операцию ввода-вывода. Использование DMA позволяет серьёзно повысить быстродействие системы в целом, а для, скажем, видеокарт и сетевых карт это и вовсе практически обязательная вещь из-за объёма обмениваемых данных.
Разумеется, в Linux есть свой API для DMA. По понятным причинам его используют практически все драйвера. Для того, чтобы сделать Rust for Linux практичным, нужно предоставить доступ к DMA для кода на Rust, и соответствующий патч от 8 января 2025 года именно это и делает. В нём добавляется минимально необходимый для использования код: RAII-обёртка над выделенными регионами памяти, операции для записи и небезопасная операция для чтения (почему unsafe? Потому что соответствующий метод read предоставляет доступ к выделенной памяти, как неизменяемый растовый слайс, и это пользователю API нужно удостовериться, что, пока слайс жив, железо не меняет данные под слайсом и тем самым не вносит UB).
Первым же ответом от Кристофа Хэллвига — человека, который отвечает за DMA в Linux — было "No rust code in kernel/dma, please". Да, это ответ целиком. Эта претензия абсолютно необоснована — достаточно взглянуть на первые строчки diff-а, чтобы понять, что меняется лишь растовый код, а не сишный в kernel/dma.
Последующий тред показал, что Кристоф абсолютно против существования растовой абстракции над DMA в любом виде, причём без предоставления внятных технических аргументов.
Скажем, вот как диалог пошёл после первого ответа:
(Miguel Ojeda): > What do you suggest?
> Keep the wrappers in your code instead of making life painful for others.
(Danilo Krummrich): > What does "your code" mean? Duplicated in every driver? Otherwise rust/kernel/dma.rs seems reasonable, no?
> Yes, interfaces to the DMA API should stay in readable C code and not in weird bindings so that it reminds greppable and maintainable.
Последующий обмен сообщениями показал, что Кристоф, судя по всему, считает, что этот код делает Linux многоязычным и потому автоматически плохим. Замечания от мейнтейнеров R4L о том, что никто не ожидает от Кристофа, что он будет заниматься поддержкой растового кода, ни к чему не привели. Сообщения Кристофа содержали такие занимательные цитаты:
(link)
If you want to make Linux
impossible to maintain due to a cross-language codebase do that in
your driver so that you have to do it instead of spreading this cancer
to core subsystems. (where this cancer explicitly is a cross-language
codebase and not rust itself, just to escape the flameware brigade).
(link)
Every additional bit that the another
language creeps in drastically reduces the maintainability of the kernel
as an integrated project. The only reason Linux managed to survive so
long is by not having internal boundaries, and adding another language
complely breaks this.
<...>
I do not want it [Rust — прим. моё] anywhere near a huge C code base that I need to
maintain.
(link)
> I do acknowledge your reservations about the possible maintenance burden
> due to the introduction of a rust (or another language) consumer of the
> dma-api. But I was hoping that we could arrive at some sort of common
> ground?
The common ground is that I have absolutely no interest in helping
to spread a multi-language code base. I absolutely support using
Rust in new codebase, but I do not at all in Linux.
Для понимания масштаба неадекватности претензий: R4L уже существует довольно продолжительное время, причём в транке, по понятным причинам там уже есть приличное количество абстракций над API ядра, а патч, с которого и начался весь сыр-бор, оборачивает один (1) сишный тип, две (2) сишные функции и пачку связанных с этими функциями флагов.
🤡35❤13🤬6👍2👎1🎉1
Схожие истории:
1. В конце августа 2024 года Wedson Almeida Filho добровольно покинул Rust for Linux:
2. Реакция на это от Asahi Lina, разработчика Asahi Linux (проекта по реализации дистрибутива Linux, работающего на компьютерах Apple с процессорами Apple Silicon):
1. В конце августа 2024 года Wedson Almeida Filho добровольно покинул Rust for Linux:
I am retiring from the project. After almost 4 years, I find myself lacking the
energy and enthusiasm I once had to respond to some of the nontechnical
nonsense [выделение моё], so it's best to leave it up to those who still have it in them.
2. Реакция на это от Asahi Lina, разработчика Asahi Linux (проекта по реализации дистрибутива Linux, работающего на компьютерах Apple с процессорами Apple Silicon):
I regretfully completely understand Wedson's frustrations.
<...>
A subset of C kernel developers just seem determined to make the lives of the Rust maintainers as difficult as possible. They don't see Rust as having value and would rather it just goes away.
When I tried to upstream the DRM abstractions last year, that all was blocked on basic support for the concept of a "Device" in Rust. Even just a stub wrapper for struct device would be enough.
That simple concept only recently finally got merged, over one year later [выделение моё].
😢14❤4🖕2
Forwarded from Pragmatic Programmer (Nikita Bishōnen)
Решил протестировать сборку компилятором из коробки на Apple M1 Pro vs Ryzen 9 7900X3D (конечно же не холивара ради):
-
-
Угадайте какой процессор где?
Ответ:M1 4 минуты против AMD за 1 минуту
-
Finished `release` profile [optimized] target(s) in 1m 47s
-
Finished `release` profile [optimized] target(s) in 4m 35s
Угадайте какой процессор где?
Ответ:
👍7🤔3🤡2🔥1
Блог*
#music Опять из #game dbsoundworks.bandcamp.com/track/disco-descent-1-1
#game
Вчера вышла Rift of the Necrodancer, спинофф Crypt of the Necrodancer. Эта игра ближе к традиционным ритм-играм, но при этом всё равно имеет свои фишки, перешедшие из прошлой игры.
Брать, скорее всего, стоит — я в своё время демку с жалкими четырьмя треками до дыр заиграл, а на фестивале Steam next fest демка вошла в топ 50 наиболее играемых (из более чем 3000!).
Ну и да, до 11 февраля на игру скидка 10%.
Вчера вышла Rift of the Necrodancer, спинофф Crypt of the Necrodancer. Эта игра ближе к традиционным ритм-играм, но при этом всё равно имеет свои фишки, перешедшие из прошлой игры.
Брать, скорее всего, стоит — я в своё время демку с жалкими четырьмя треками до дыр заиграл, а на фестивале Steam next fest демка вошла в топ 50 наиболее играемых (из более чем 3000!).
Ну и да, до 11 февраля на игру скидка 10%.
Steampowered
Save 30% on Rift of the NecroDancer on Steam
The NecroDancer's back in an all-new rhythm game! Dragged into a strange new world, Cadence must engage in musical combat with monsters surging through the Rift! Face pulse-pounding Rhythm Rifts where every beat is a battle, all set to an original soundtrack…
❤🔥6
Блог*
#game Вчера вышла Rift of the Necrodancer, спинофф Crypt of the Necrodancer. Эта игра ближе к традиционным ритм-играм, но при этом всё равно имеет свои фишки, перешедшие из прошлой игры. Брать, скорее всего, стоит — я в своё время демку с жалкими четырьмя…
YouTube
Rift of the NecroDancer OST - RAVEVENGE by Alex Moukala (ft. Aram Zero)
Rift of the NecroDancer is a rhythm game spinoff of the beloved game Crypt of the NecroDancer by Brace Yourself Games, set to release in early 2024.
Wishlist on Steam: https://bit.ly/RiftoftheNecroDancer
We’ve been fans of Alex for a long time from his…
Wishlist on Steam: https://bit.ly/RiftoftheNecroDancer
We’ve been fans of Alex for a long time from his…
👍1🤔1
Forwarded from Install Wizard
https://stackoverflow.com/questions/39863255/repz-ret-why-all-the-hassle
Процессорная архитектура - это магия. Без шуток.
(речь в вопросе о том, что в сгенерированном компилятором коде (и не только) нередко можно встретить вместо обычной инструкции
Процессорная архитектура - это магия. Без шуток.
(речь в вопросе о том, что в сгенерированном компилятором коде (и не только) нередко можно встретить вместо обычной инструкции
RET
(возврат из функции) бессмысленно выглядящую конструкцию REPZ RET
(REPZ
повторяет инструкцию после неё определённое кол-во раз и актуальна только для работы со строками; для RET
она, очевидно, ничего не делает, это всё равно, что написать while(true) { return; }
)Stack Overflow
repz ret: why all the hassle?
The issue of the repz ret has been covered here [1] as well as in other sources [2, 3] quite satisfactorily. However, reading neither of these sources, I found answers to the following:
What is the
What is the
🤯8🔥1
Блог*
#rustforlinux #suckassstory TL:DR: Тем временем в Linux один активный долбоёб мейнтейнер Christoph Hellwig активно мешает #Rust for Linux. DMA (Direct memory access) — технология, предоставляющая (относительно) прямой доступ к RAM для периферии. Это позволяет…
#rustforlinux #suckassstory
(link)
Гектор Мартин (Hector Martin), ведущий разработчик Asahi Linux, снял с себя полномочия мейнтейнера поддержки железа ARM и Apple
(link)
I no longer have any faith left in the kernel development process or community management approach.
Apple/ARM platform development will continue downstream. If I feel like sending some patches upstream in the future myself for whatever subtree I may, or I may not. Anyone who feels like fighting the upstreaming fight themselves is welcome to do so.
Гектор Мартин (Hector Martin), ведущий разработчик Asahi Linux, снял с себя полномочия мейнтейнера поддержки железа ARM и Apple
😢14👍3👌3
#prog #rustlib #article
parser combinators with nom 8 are here!
(восьмая мажорная версия — это прям дофига для Rust-библиотек)
Geoffroy Couprie рассказывает о новой архитектуре nom. В этой версии он позаимствовал из chumsky подход к архитектуре парсеров. Про этот подход ещё в 2022 году писал Niko Matsakis в статье Many modes: a GAT pattern, которая демонстрировала, как GAT могут пригодиться в реальных библиотеках, и таким образом обосновывала необходимость иметь GAT в языке.
В nom 8 парсером является то, что реализует трейт Parser. Вот как выглядит его определение за вычетом методов с реализацией по умолчанию:
Параметр
Трейт Mode является ключом к новым возможностям. Реализации этого трейта позволяют абстрагироваться над "выходом парсера, имеющего отношение к T":
Для чего всё это нужно? Дело в том, что в nom есть комбинаторы, которые используют переданный аргументом парсер, но при этом не используют то, что этот парсер выдаёт в качестве результата. В качестве примера таких комбинаторов можно назвать preceded и delimited. Если конструирование значения является дорогим (скажем, это условный separated_list0, который собирает результаты разбора под-парсеров в вектор), то запускать парсер только ради того, чтобы отбросить его значение, будет довольно расточительно.
В самом nom определены два типа, которые реализовывают
Так как ошибка парсера тоже может дорого конструироваться, тип
Как вы могли заметить, у
Новый подход позволяет написать ветвление по
parser combinators with nom 8 are here!
(восьмая мажорная версия — это прям дофига для Rust-библиотек)
Geoffroy Couprie рассказывает о новой архитектуре nom. В этой версии он позаимствовал из chumsky подход к архитектуре парсеров. Про этот подход ещё в 2022 году писал Niko Matsakis в статье Many modes: a GAT pattern, которая демонстрировала, как GAT могут пригодиться в реальных библиотеках, и таким образом обосновывала необходимость иметь GAT в языке.
В nom 8 парсером является то, что реализует трейт Parser. Вот как выглядит его определение за вычетом методов с реализацией по умолчанию:
trait Parser<Input> {
type Output;
type Error: ParseError<Input>;
fn process<OM: OutputMode>(
&mut self,
input: Input,
) -> PResult<OM, Input, Self::Output, Self::Error>;
}
Параметр
OM
реализует трейт OutputMode, реализации которого являются фактически type-level конфигом парсера:trait OutputMode {
type Output: Mode;
type Error: Mode;
type Incomplete: IsStreaming;
}
Трейт Mode является ключом к новым возможностям. Реализации этого трейта позволяют абстрагироваться над "выходом парсера, имеющего отношение к T":
trait Mode {
type Output<T>;
// методы для комбинирования и преобразовывания Output
}
Для чего всё это нужно? Дело в том, что в nom есть комбинаторы, которые используют переданный аргументом парсер, но при этом не используют то, что этот парсер выдаёт в качестве результата. В качестве примера таких комбинаторов можно назвать preceded и delimited. Если конструирование значения является дорогим (скажем, это условный separated_list0, который собирает результаты разбора под-парсеров в вектор), то запускать парсер только ради того, чтобы отбросить его значение, будет довольно расточительно.
В самом nom определены два типа, которые реализовывают
Mode
: Emit и Check. Emit
реализовывает Mode
с type Output<T> = T
, то есть парсер работает, как обычно. Check
же реализовывает Mode
с type Output<T> = ()
, то есть парсер работает, но отбрасывает результаты. Именно такое поведение годится для комбинаторов, которым не нужен результат под-парсера. Так как конечный парсер имеет методы, обобщённые по параметру OM
, реализующему OutputMode
, парсер не может сконструировать результат напрямую, а вынужден использовать для этого методы Mode
, определённые на OM::Output
. В случае Emit
эти методы просто применяют переданные функции к аргументам, а для Check
эти методы просто дропают переданные функции и возвращают ()
.Так как ошибка парсера тоже может дорого конструироваться, тип
OutputMode::Error
по аналогичным причинам также реализует Mode
. Это нужно, например, для opt, который делает парсер опциональным и по понятным причинам отбрасывает и разобранный результат, и ошибку.Как вы могли заметить, у
OutputMode
также есть параметр Incomplete
, реализующий трейт IsStreaming. Он отвечает за то, является ли недостаточный вход фатальной ошибкой или же одним из вариантов ошибки, от которой можно восстановиться. Раньше почти каждый базовый комбинатор nom существовал в двух версиях: streaming и complete. Это было нежелательно по нескольким причинам, главная из которых — разные сорта парсеров очень легко перепутать при написании своих парсеров и потом долго ловить непонятные ошибки. Ещё одним нежелательным следствием этого подхода стало, очевидно, дублирование кода. Разные версии этих парсеров по разному обрабатывали неполный вход, но за вычетом этого аспекта логика там была одинаковая.Новый подход позволяет написать ветвление по
OM::IsIstreaming::is_streaming()
и обработать оба варианта в одной функции, естественным образом собирая разные варианты реагирования на ошибку неполного входа в одном месте. Так как в nom оба типа, реализующих IsStreaming
— Streaming и Complete — в соответствующих методах просто возвращают true
и false
соответственно, компилятор может увидеть ветвление по константному значению и просто убрать одну из веток, избежав генерации ненужного кода.🔥7🎉2👌1
Из чуть менее важных новостей: nom ориентирован больше на написание парсеров для машинно-читаемых форматов, где в приоритете быстродействие. Для написания парсеров конфигов и языков программирования больше нужны другие вещи, которые в библиотеке для написания парсеров общего назначения не очень уместны. С релизом nom 8 также появился новый крейт nom-language, в котором в дальнейшем и будет добавляться код под такие нужды.
В настоящий момент там две вещи.
(Если вы задаётесь вопросом, что там делает
В настоящий момент там две вещи.
VerboseError
собирает все ошибки дерева парсеров и потому больше подходит для диагностирования ошибок в человеко-читаемом формате. Функция precedence позволяет разбирать выражения, учитывая приоритеты операторов, без их кодирования в грамматике:// пачка импортов, которые не имеет смысла показывать
fn parser(i: &str) -> IResult<&str, i64> {
precedence(
unary_op(1, tag("-")),
fail(),
alt((
binary_op(2, Assoc::Left, tag("*")),
binary_op(2, Assoc::Left, tag("/")),
binary_op(3, Assoc::Left, tag("+")),
binary_op(3, Assoc::Left, tag("-")),
)),
alt((
map_res(digit1, |s: &str| s.parse::<i64>()),
delimited(tag("("), parser, tag(")")),
)),
|op: Operation<&str, &str, &str, i64>| {
use nom_language::precedence::Operation::*;
match op {
Prefix("-", o) => Ok(-o),
Binary(lhs, "*", rhs) => Ok(lhs * rhs),
Binary(lhs, "/", rhs) => Ok(lhs / rhs),
Binary(lhs, "+", rhs) => Ok(lhs + rhs),
Binary(lhs, "-", rhs) => Ok(lhs - rhs),
_ => Err("Invalid combination"),
}
}
)(i)
}
assert_eq!(parser("8-2*2"), Ok(("", 4)));
assert_eq!(parser("4-(2+2)"), Ok(("", 0)));
assert_eq!(parser("3-(2*3)+7+2*2-(2*(2+4))"), Ok(("", -4)));
(Если вы задаётесь вопросом, что там делает
fail
: этот аргумент функции precedence
описывает, как парсить постфиксные выражения. В этой грамматике постфиксных операторов нет, поэтому попытка распарсить что-то, как постфиксное выражение, должно всегда завершаться ошибкой)docs.rs
nom_language - Rust
Langage parsing combinators for the nom parser combinators library
🤯4👍1🎉1
Forwarded from Too Long, Did Read
Subaru ImpressUs, или как открыть машину, зная только ее номер
https://samcurry.net/hacking-subaru
Прочитал недавно вышедший баг-репорт Сэма Карри - очень крутого баг-баунти хантера, который специализируется на поиске уязвимостей в компаниях-производителях автомобилей.
Сэм рассказывает о том, как год назад купил маме Subaru Impreza нового поколения, к которой по умолчанию прилагается сервис “Starlink” - нет, не спутниковый интернет Маска, а всего лишь умная система управления машиной + ее отслеживания, что-то вроде Find My, но для машин.
Оказалось, что зная номера машины, через эту систему ее можно отследить, открыть и угнать без шума.
Как это часто бывает, самая опасная часть айти-системы - админка для сотрудников, так как защищена она бывает плохо (ну а кто зайдет), а возможностей там просто дохрена.
Вот и в этой истории обнаружилось, что в админке крайне уязвимая апишка, если конкретнее - есть эндпоинт “resetPassword”, который ведет себя вот так:
Дело за малым - нужно найти подходящий емейл сотрудника.
Естественно, корп емейл у Субару, как практически у всех, имеет формат [first_initial][last]@subaru.com, так что достаточно найти ФИО любого сотрудника на линкдине.
Но все-таки, не может же все быть так легко?
И да, и нет.
Для того, чтобы пользоваться функционалом админки после того, как мы вошли туда, сбросив пароль, надо также ввести 2FA - в данном случае, секретный вопрос, вроде “имя первой собаки”. бтв, ужасное решение, никогда не делайте так )
Но вскоре выяснилось, что функционал 2FA реализован… на фронте.
То есть, просто закомментив на уже отрисованном сайте 1 строчку:
/
Итак, мы внутри админки. Что дальше?
Начнем с того, что сотрудник имеет доступ к данным всех покупателей в США, Канаде и Японии (пиздец) - и ему доступен поиск по фио, телефону, и даже номерам машины. Как пишет Сэм, сложно сделать систему безопасной, если в ней предусмотрен такой уровень доступа для любого 18-ти летнего интерна в компании.
Одна из возможностей сотрудника в админке - добавлять верифицированного пользователя в систему Starlink… без уведомления текущих оунеров и юзеров. Ни смс, ни письма на почту, вообще ничего!
То есть, имея доступ в админку, я могу выдать себе доступ к вашей машине, а вы этого даже не узнаете.
А из самой системы Старлинк, наконец, можно:
- Удаленно заводить и останавливать, открывать, закрывать и отслеживать машину. А еще бибикать :)
- Вытащить историю перемещений машины ЗА ПОСЛЕДНИЙ ГОД, размеченную по времени + с информацией о том, когда машину заводили и глушили.
- Получить все персональные данные владельца, включая имена других авторизованных пользователей, домашний адрес и т д.
Хотя кому нужен домашний адрес, когда есть годовая история всех перемещений…
Дальше Сэм с коллегой сделали proof of concept, объединив все находки в одну консольную утилиту: вводишь номер машины, тебя редиректит на Starlink с полным доступом к машине.
Посмотрите видео, это просто полный треш: https://youtu.be/0i8juy6RPBI.
Заключение
Если вы думаете, что такие приколы бывают только с Субару, то можете посмотреть на аналогичную историю с KIA, а также на открытую базу данных Volkswagen, в которой хранится история перемещения ВСЕХ машин марки, включая машины полицейских и сотрудников спецслужб.
А еще советую всем интересующимся посмотреть выступление Сэма на DEFCON (он взломал все модемы очень крупного интернет-провайдера) и подкаст Critical Thinking с его участием: там он, например, рассказывает, к чему приводят его находки (его недавно арестовали на границе в аэропорту и обвинили в какой-то жести. но все хорошо закончилось).
https://samcurry.net/hacking-subaru
Прочитал недавно вышедший баг-репорт Сэма Карри - очень крутого баг-баунти хантера, который специализируется на поиске уязвимостей в компаниях-производителях автомобилей.
Сэм рассказывает о том, как год назад купил маме Subaru Impreza нового поколения, к которой по умолчанию прилагается сервис “Starlink” - нет, не спутниковый интернет Маска, а всего лишь умная система управления машиной + ее отслеживания, что-то вроде Find My, но для машин.
Оказалось, что зная номера машины, через эту систему ее можно отследить, открыть и угнать без шума.
Как это часто бывает, самая опасная часть айти-системы - админка для сотрудников, так как защищена она бывает плохо (ну а кто зайдет), а возможностей там просто дохрена.
Вот и в этой истории обнаружилось, что в админке крайне уязвимая апишка, если конкретнее - есть эндпоинт “resetPassword”, который ведет себя вот так:
POST /forgotPassword/resetPassword.json HTTP/1.1
Host: portal.prod.subarucs.com
{
"email": "[email protected]",
"password": "Example123!",
"passwordConfirmation": "Example123!"
}
{
"error": "Invalid email"
}
Дело за малым - нужно найти подходящий емейл сотрудника.
Естественно, корп емейл у Субару, как практически у всех, имеет формат [first_initial][last]@subaru.com, так что достаточно найти ФИО любого сотрудника на линкдине.
Но все-таки, не может же все быть так легко?
И да, и нет.
Для того, чтобы пользоваться функционалом админки после того, как мы вошли туда, сбросив пароль, надо также ввести 2FA - в данном случае, секретный вопрос, вроде “имя первой собаки”. бтв, ужасное решение, никогда не делайте так )
Но вскоре выяснилось, что функционал 2FA реализован… на фронте.
То есть, просто закомментив на уже отрисованном сайте 1 строчку:
/
/$(‘#securityQuestionModal').modal('show’);
, можно спокойно пользоваться всем функционалом сайта. Итак, мы внутри админки. Что дальше?
Начнем с того, что сотрудник имеет доступ к данным всех покупателей в США, Канаде и Японии (пиздец) - и ему доступен поиск по фио, телефону, и даже номерам машины. Как пишет Сэм, сложно сделать систему безопасной, если в ней предусмотрен такой уровень доступа для любого 18-ти летнего интерна в компании.
Одна из возможностей сотрудника в админке - добавлять верифицированного пользователя в систему Starlink… без уведомления текущих оунеров и юзеров. Ни смс, ни письма на почту, вообще ничего!
То есть, имея доступ в админку, я могу выдать себе доступ к вашей машине, а вы этого даже не узнаете.
А из самой системы Старлинк, наконец, можно:
- Удаленно заводить и останавливать, открывать, закрывать и отслеживать машину. А еще бибикать :)
- Вытащить историю перемещений машины ЗА ПОСЛЕДНИЙ ГОД, размеченную по времени + с информацией о том, когда машину заводили и глушили.
- Получить все персональные данные владельца, включая имена других авторизованных пользователей, домашний адрес и т д.
Хотя кому нужен домашний адрес, когда есть годовая история всех перемещений…
Дальше Сэм с коллегой сделали proof of concept, объединив все находки в одну консольную утилиту: вводишь номер машины, тебя редиректит на Starlink с полным доступом к машине.
Посмотрите видео, это просто полный треш: https://youtu.be/0i8juy6RPBI.
Заключение
Если вы думаете, что такие приколы бывают только с Субару, то можете посмотреть на аналогичную историю с KIA, а также на открытую базу данных Volkswagen, в которой хранится история перемещения ВСЕХ машин марки, включая машины полицейских и сотрудников спецслужб.
А еще советую всем интересующимся посмотреть выступление Сэма на DEFCON (он взломал все модемы очень крупного интернет-провайдера) и подкаст Critical Thinking с его участием: там он, например, рассказывает, к чему приводят его находки (его недавно арестовали на границе в аэропорту и обвинили в какой-то жести. но все хорошо закончилось).
samcurry.net
Hacking Subaru: Tracking and Controlling Cars via the STARLINK Admin Panel
On November 20, 2024, Shubham Shah and I discovered a security vulnerability in Subaru’s STARLINK admin panel that gave us unrestricted access to all vehicles and customer accounts in the United States, Canada, and Japan.
🤯10👍9🤡6❤1🌚1