我经常说的著名黑客安德鲁·黄(Bunnie):如果我们认为技术是魔术,那么我们就有可能成为其人质。我最近遇到了这种情况,但幸运的是,我被开放源代码拯救了。
在撰写本文时,Garmin正在遭受大规模的勒索软件攻击。它影响了我,因为我拥有Garmin Instinct手表。我对它们感到非常满意,并且它们在许多方面都具有魔力,因此许多可能性都装入了这种小巧的小工具中。
另外,我有一个爱好-划船支腿[支腿独木舟-大约。每。]
我相信GPS手表是必不可少的安全功能,尤其是在导航中,因为当您离地面几百米远时,很难判断水的速度。如果您陷入困境,不了解情况,则有被丢入海中或更糟的风险。
在新加坡附近可能会有极端潮流。随着潮汐变化,南中国海最终通过新加坡海峡进入安达曼海,引发了不断变化的背险潮流。因此,每次笔触之后,我的GPS数据都会上传到Garmin Connect云中,以进行路线检查,以标记出潮流中的危险变化。
虽然将此类数据上传到Garmin的云上会带来明显而真实的隐私风险,但我们都知道要进行权衡:几乎没有时间担心此类事情,并且服务开箱即用。
直到昨天
我们刚刚遇到了一些特别不寻常的潮流,我的赛艇搭档希望在某些困难的地方看到速度。我进入应用程序以获取数据,然后……发现Garmin受到攻击。

Garmin数据已被劫持为人质,包括我的个人赛艇数据:我一生的一小部分已成为技术的人质。
一群朋友告诉我尝试Strava。好消息是Garmin允许您从Instinct手表中提取数据文件,以上传到第三方服务。您只需要将手表连接到常规USB端口,它就会显示为大容量存储设备。
坏消息是,当我尝试创建Strava帐户时,所有危险信号都消失了。该网站是充满了黑暗的模板,然后点击拒绝Strava访问我的健康数据按钮后,整个系列的对话框出现:

点击

拒绝......点击拒绝权限...

点击OK ...
三次点击来拒绝访问,如果您轻松地继续按下下部按钮,那么您将做出另一种选择-偶然。在那之后,我迎来了一个令人毛骨悚然的追随者名单(他们是否从同一个电子邮件地址中学到了很多关于我的信息?),然后是一个棘手的对话框,如果您回答不正确,系统将提示您输入信用卡信息,作为“免费”的一部分。试用版 ”。
由于Garmin已经卖出了200美元以上的设备,因此收集我的个人数据简直是甜点。但是对于Strava来说,我的数据是主要课程。就个人而言,我很清楚Strava向其投资者表明,他们将通过货币化我的个人数据(包括我的健康信息)来获利。
这绝对是我无法接受的。从Garmin转移到Strava并不是从抵押中释放数据,而是像从平底锅变成了大火。
我计划在第二天再去一次船上,这将是很棒的一些速度分析。但是我对Strava感到非常生气,以至于我不再寻找其他选择,而是决定开发自己的具有可靠个人信息保护功能的替代产品。
我高兴地发现了一个名为gpsbabel(感谢开发人员!我很讨厌!),它将数据从半专有(?)专有Garmin格式转换为兼容的.GPX格式。从那里,我能够提取XML解析块,并通过Folium API将其与OpenStreetMaps结合起来,用我的数据创建自定义地图。
即使我迷失了尝试使用Google Maps API的权利,该API在所有地图图块上都放置了可怕的“仅开发”水印,但这只花了一个晚上。考虑到所有事情,这不是浪费我的时间,但这主要是找到合适的开源代码并将它们粘合在Python中的问题(顺便说一句,Python是很好的粘合剂,但是结构性很差。不要用它制造大型项目)。代码的质量很差劲,但是Python允许它,并且可以完成工作。考虑到这些注意事项,您可以将其用作寻找更好产品的起点。
现在,我可以完全控制自己的数据,并且可以对其进行有意义的可视化。例如,将速度显示为整个课程中的热点图,并以与当前速度成比例的圆圈显示,并在光标悬停时显示当前特定速度和心率的文本: 这正是我需要的数据,格式为必填,不多也不少...此外,问题是可以直接链接到的单个html文件。没有分析,没有cookie。只有我决定与您共享的数据。 这是我用来绘制地图数据的代码:

def plot_osm_map(track, output='speed-map.html', hr=None):
for i in range(len(track['speed'])):
track['speed'][i] = speed_conversion(track['speed'][i])
speeds = track['speed']
minima = min(speeds)
maxima = max(speeds)
norm = matplotlib.colors.Normalize(vmin=minima, vmax=maxima, clip=True)
mapper = cm.ScalarMappable(norm=norm, cmap=cm.plasma)
m = folium.Map(location=[track['lat'][0], track['lon'][0]], zoom_start=15)
for index in range(len(track['lat'])):
if track['speed'][index] == 0:
track['speed'][index] = 0.01
else:
track['speed'][index] = track['speed'][index]
if hr:
try:
tooltip=str(track['speed'][index]) + ' ' + str(hr['hr'][index]) +'bpm'
except:
tooltip=str(track['speed'][index])
else:
tooltip=str(track['speed'][index])
folium.CircleMarker(
location=(track['lat'][index], track['lon'][index]),
radius=track['speed'][index]**2 / 8,
tooltip=tooltip,
fill_color=matplotlib.colors.to_hex(mapper.to_rgba(track['speed'][index])),
fill=True,
fill_opacity=0.2,
weight=0,
).add_to(m)
m.save(output)
就像我说的那样,代码的质量不是最好的,但是它可以工作并且编写起来很快。
更好的是,我不会再将任何数据上传到云中了-从我的生活中删除另一个监视渠道而又不失去任何质量或便利性,这是无形的荣幸。
这也是关于开源生态系统今天表现如何的一个有趣的元历史。当Garmin云崩溃时,我能够通过整合各种开源框架在短短一天之内替换最重要的功能。
开源的目的不是在仪式上汇编材料。关键是要意识到技术并不是万能的:任何人都可以自己选择一种选择,以使自己摆脱潜在的人质情况。如果我们愿意,开源可以创建和运行我们自己的工具和服务。
也可以看看:
- “ Garmin已经确认了网络攻击的事实,并恢复了某些服务的活力”
- “安全周31:对Garmin基础架构的攻击”
- “出版物BleepingComputer发布了有关勒索病毒攻击Garmin的详细信息»