Top
Best
New

Posted by sibellavia 12/19/2025

TP-Link Tapo C200: Hardcoded Keys, Buffer Overflows and Privacy(www.evilsocket.net)
347 points | 123 comments
rao-v 12/19/2025|
I'm a little frustrated with articles like this that scattershot their critique by conflating genuine failures with problems that even FAANGs struggle with.

In particular, I don't love it when an article attacks a best practice as a cheap gotcha:

"and this time it was super easy! After some basic reversing of the Tapo Android app, I found out that TP-Link have their entire firmware repository in an open S3 bucket. No authentication required. So, you can list and download every version of every firmware they’ve ever released for any device they ever produced"

That is a good thing - don't encourage security through obscurity! The impact of an article like this is as likely to get management to prescribe a ham-handed mandate to lock down firmware as it is to get them to properly upgrade their security practices.

hdgvhicv 12/19/2025||
> I found out that TP-Link have their entire firmware repository in an open S3 bucket.

Nobody tell them about Linux!

locknitpicker 12/20/2025||
> Nobody tell them about Linux!

The blogger will blow a gasket when they discover that the likes of GitHub provides access to both installers and software. A hacker's candy store!

plugger 12/22/2025|||
This blogger is the author of bettercap, safe to say they're fairly across Github
evilsocket 12/20/2025|||
Do you people realize that there's a big difference between open source and proprietary technologies right?
tyami94 12/21/2025||
Doesn't matter really, keeping blobs hidden doesn't actually do anything except make it slightly harder to analyze the software. Making all blobs easily and readily available is exactly what I want the vendor to do. Black boxes don't make things secure.
evilsocket 12/21/2025||
Agreed 100%, never said the opposite
NathanielK 12/20/2025|||
This blog post is pretty readable, but it's still obviously written with the help of an LLM. A common trend is that LLMs lack the nuance and write everything with the same enthusiasm. So in a blogpost it'll infer things are novel or good/bad that are actually neutral.

Not a bad blogpost because of this, but you need to be careful reading. I've noticed most of the article on the HN front page are written with AI assistance.

jorvi 12/20/2025||
I always wonder if the people who let LLMs write (and think) for them realize they're steadily atrophying their brain.
void-star 12/20/2025|||
I think maybe you’re reading this wrong. Reverse-engineering blog posts like this are just a fun and instructive way of telling the story of how someone did a thing. Having written and read a bunch of these in the past myself, I found this one to be a great read!

Edit: just want to add, the “how I got the firmware” part of this is also the least interesting part of this particular story.

jabedude 12/19/2025|||
I didn't notice a negative tone at all when he talked about the firmwares being publicly hosted. You did?
AceJohnny2 12/19/2025||
Yes, heavily, because of the use of adjectives and repeating the points.

Here, I'll emphasize the words that elicit the tone:

> After some basic reversing of the Tapo Android app, I found out that TP-Link have their entire firmware repository in an open S3 bucket. No authentication required. So, you can list and download every version of every firmware they’ve ever released for any device they ever produced: [command elided] The entire output is here, for the curious. This provides access to the firmware image of every TP-Link device - routers, cameras, smart plugs, you name it. A reverse engineer’s candy store.

Highlighting (repeatedly) the ease and breadth of access is a basic writing technique to illustrate the weakness of a security system.

sally_glance 12/20/2025|||
To me the phrasing seems objective. Making your binaries available to the public is good (though source would be better).

Replace [firmware] with [random popular GitHub repo] and nobody would blink. Replace [firmware] with [customer email address] and it would be a legal case. Differentiating here is important.

opello 12/20/2025|||
I think it fails to be objective because of the repetition. It's an open S3 bucket. No need to state that no authentication was required, it's already open. It's not about economy of writing but the repetition emphasizes the point, elevating the perceived significance to the author or that the author wants the reader to take away.

Furthermore, the repeated use of every when discussing the breadth of access seems like it would easily fall into the "absolutes are absolutely wrong" way of thinking. At least without some careful auditing it seems like another narrative flourish to marvel at this treasure trove (candy store) of firmware images that has been left without adequate protection. But it seems like most here agree that such protection is without merit, so why does it warrant this emphasis? I'm only left with the possible thought that the author considered it significant.

pacifika 12/20/2025|||
If someone DDOSes an open s3 bucket they’ll get a huge bill. If there is something in front of it, they might not.
wkat4242 12/20/2025|||
An 'open S3 bucket' sounds really bad. If it were posted on an HTTPS site without authentication, like the firmware for most devices, it wouldn't sound so bad.

Sure an open bucket is bad, if it's stuff you weren't planning on sharing with the whole world anyway.

necovek 12/20/2025|||
Since firmware is supposed to be accessible to users worldwide, making it easier to get it is good.

But how is an open, read-only S3 bucket worse than a read-only HTTPS site hosting exactly the same data?

The only thing I can see is that it is much easier to make it writeable by accident (for HTTPS web site or API, you need quite some implementation effort).

wkat4242 12/21/2025||
No wait I agree with you. I think it is bad framing as "S3 open bucket" when people would totally understand an open website :)
locknitpicker 12/20/2025|||
> An 'open S3 bucket' sounds really bad.

Only to gullible, clueless types.

Full blown production SPAs are served straight from public access S3 buckets. The only hard requirement is that the S3 bucket enforces read-only access through HTTPS. That's it.

Let's flip it the other way around and make it a thought experiment: what requirement do you think you're fulfilling by enforcing any sort of access restriction?

When you feel compelled to shit on a design trait, the very least you should do is spend a couple of minutes thinking about what problem it solves and what are the constraints.

wkat4242 12/21/2025||
No I agree with you. I think it is bad framing as "S3 open bucket" when people would totally understand an open website :)

I'm not shitting on anything except the wording in the article.

I guess I didn't word it clearly.

In our company we don't really serve directly from open buckets but through cloudfront. Though this is more because we are afraid of buckets marked open by mistake so they are generally not allowed. But I agree there's nothing bad about it. I just meant it sounds much worse (at least to someone in cybersec like me) and I don't like the effect used as such in the article.

jacquesm 12/20/2025|||
No, it clearly has a gloating tone to it. 'A reverse engineer's candy store' is clearly meant as a slur.

When in fact TP-Link is doing the right thing with keeping older versions available. So this risks some higher up there thinking 'fuck it, we can't win, might as well close it all off'.

evilsocket 12/20/2025||
I just meant that it was very convenient to have the firmware images there on S3, nothing else :D Many vendors make the process of even just obtaining a copy of the firmware much harder than that, so for once I was glad it has been much easier. Also being able to bindiff two adjacent versions of the same firmware is great ... all in all I was just expressing my happiness :D
locknitpicker 12/20/2025||||
> Highlighting (repeatedly) the ease and breadth of access is a basic writing technique to illustrate the weakness of a security system.

It's a firmware distribution system. It's read-only access to a public storage account designed to provide open access to software deployment packages that the company wishes to broadcast to all products. Of course there is no auth requirement at all. The system is designed to allow everyone in the world to install updates. What compells anyone to believe the system would be designed to prevent public access?

lmz 12/20/2025||
Maybe listing shouldn't be enabled even if all the files are public.
locknitpicker 12/20/2025|||
> Maybe listing shouldn't be enabled even if all the files are public.

I don't see why. Support for firmware upgrades literally involve querying available packages and downloading the latest ones (i.e., apply upgrades). Either you use something like the S3 interface, or you waste your time implementing a clone of what S3 already supports.

Sometimes simple is good, specially when critics can't even provide any concrete criticism.

lmz 12/21/2025||
It's not a necessary interface. Do the clients actually use S3 listing to determine what the latest firmware is? Personally I would put a service in the middle that takes in the model number, region, etc and then returned the most recent firmware URL. There's no reason to have historical versions be easily listable by curious people.
tyami94 12/21/2025||
Why not? The firmware was already public at one point. If people are analyzing your app to find an S3 bucket full of firmware, I'd assume they'd have a pretty good reason to go through the effort.
dns_snek 12/20/2025|||
Why not? It's just an annoyance step that is predicated on obfuscating information that has already been made publicly available.
LoganDark 12/20/2025||||
Or to illustrate the convenience to the point of the article, being reverse engineering; not necessarily to critique their security practices here. Being easy to reverse engineer is not necessarily a weakness of security (as the inverse would simply be obscurity).
moron4hire 12/20/2025|||
Yeah, that writing definitely reeks of incredulity.
tecleandor 12/19/2025|||
Yep, I think it should always be that way, firmwares should be always available.
Angostura 12/19/2025|||
I didnt really interpret that as a particular criticism really
theropost 12/19/2025||
I think this kind of critique often leans too hard on “security through obscurity” as a cheap punchline, without acknowledging that real systems are layered, pragmatic, and operated by humans with varying skill levels. An open firmware repository, by itself, is not a failure. In many cases it is the opposite: transparency that allows scrutiny, reproducibility, and faster remediation. The real risk is not that attackers can see firmware, but that defenders assume secrecy is doing work that proper controls should be doing anyway.

What worries me more is security through herd mentality, where everyone copies the same patterns, tooling, and assumptions. When one breaks, they all break. Some obscurity, used deliberately, can raise the bar against casual incompetence and lazy attacks, which, frankly, account for far more incidents than sophisticated adversaries. We should absolutely design systems that are easy to operate safely, but there is a difference between “simple to use” and “safe to run critical infrastructure.” Not every button should be green, and not every role should be interchangeable. If an approach only works when no one understands it, that is bad security. But if it fails because operators cannot grasp basic layered defenses, that is a staffing and governance problem, not a philosophy one.

void-star 12/20/2025|||
I’m beginning to think maybe I’m the only one that read this whole thing. The firmware storage isn’t the security through obscurity problem being talked about here. The hardcoded TLS private key definitely is though. And yes, it deserves shaming… terrible practice leads to terrible outcomes. Nobody is surprised that this is coming from tp-link at this point though.
fn-mote 12/19/2025|||
> An open firmware repository, by itself, is not a failure

Isn’t the complaint that the location of the repo is not publicized?

Nobody would complain if it were linked directly from the company’s web page, I assume?

JaggedJax 12/19/2025||
It's probably fair to assume that most of their other camera models are affected by the same or similar issues. It looks like they pump out quite a few models that I image have similar firmware.

This page[1] lists the C200 as last having a firmware update in October, but also lists the latest version as 1.4.4 while the article lists 1.4.2. It seems like they have pushed other updated in this time, but not these security fixes.

[1]https://community.tp-link.com/us/smart-home/kb/detail/412852

sidewndr46 12/19/2025||
I looked at some older Zyxel products and came to the same conclusion a while back. There's a whole industry of labeling generic hardware as being part of someone's else ecosystem

https://www.hydrogen18.com/blog/hacking-zyxel-ip-cameras-pt-...

https://www.hydrogen18.com/blog/hacking-zyxel-ip-cameras-pt-...

defraudbah 12/20/2025||
it's a stretch to call it generic hardware, all of cheap cameras use similar hardware, but every few months there is a new version of chip which you need to adjust to. It's challenging to find an exact chip if you want to, because they get out of date faster than JS frameworks
tehlike 12/19/2025||
They lend themselves to local connections, however, so they are workable for the tech savvy.

Definitely a problem for regular users.

syntaxing 12/19/2025||
This is why all my cameras internal or external live on an isolated VLAN with no internet access. It’s nice because HomeKit can still talk to them and I can see it online or locally without an additional app even though the camera themselves has no internet access .
kapad 12/29/2025|
How do you set this up? (TL;DR version?)
tehlike 12/19/2025||
Thingino supports C200 https://thingino.com/#:~:text=SC3336%2C%20WQ9001%2C%208MB-,T...
defraudbah 12/20/2025||
it does not, there are 5 versions of C200 as of now and thingino only supports one or two, it is very important to get the right chip, you can check https://openipc.org/
c0l0 12/19/2025||
I came here to post this, too :) What the thingino community managed to do with their firmware for these cameras is nothing short of amazing - if you happen to have a compatible camera, you really, really should give it a whirl!
kqr 12/20/2025|||
I'd love to but... how? One alternative seems to be a programmer chip that must be puchased and then modified to not fry the camera with 5V. Another is maybe stripping a USB cable and soldering it to the wifi pads on the camera chip?

Neither of these seem like good ideas for someone like me, who is relatively hardware naïve and has small children running around making it hard to concetrate for more than 30 minutes at a time.

The question is genuine. I want to do this but don't actually know by which method.

c0l0 12/20/2025|||
Yeah, I can see why that is a show-stopper for people. However, the thingino project has people among them who care deeply about ease of installation - so with these security issues discovered in the TP-Link device, chances are an installation method that relies on a vulnerable stock firmware will be provided in time :)
inferiorhuman 12/20/2025|||
I got a couple of Wyze cameras and loaded Thignino via SD card. No fuss no muss.
kqr 12/20/2025||
In this case I'm asking specifically about the C200 this article is about. Sorry for not being more clear. From what I understand the C200 does not boot from SD card.
inferiorhuman 12/20/2025|||
Ah that's fair. One of the reasons I went with the Wyze units is that they were well supported and installation was pretty easy.
defraudbah 12/20/2025|||
correct, it's in beta testing right now, you can check for alternatives https://github.com/wltechblog/thingino-installers
rescbr 12/19/2025||||
Oh, this is great! I do have this exact camera and another one that’s on the list!

I’m more than happy to ditch the scrappy RTSP setup that I have to support these cheap cameras!

inferiorhuman 12/20/2025|||
I think Thingino is great. But there are definitely still dragons lurking. I reported a bug last year and mostly forgot about it. Got a response a few months ago to check out a fix related to unexpected memory access.

I generally try not to be a huge Rust cheerleader but seriously. Yikes.

bgbntty2 12/20/2025||
Do you think the S3 bucket with the firmware will be available for the foreseeable future? If not could someone archive it somewhere? Maybe make a torrent out if it? My network is very slow and I estimated it's about 990 GiB of data (by summing the column with the bytes in the ls output the author linked). It might be useful to have it as a resource in the future for a variety of reasons.
aaronax 12/19/2025||
This is so bad that it must be intentional, right? Even though these are dirt cheap, they couldn't come up with $100,000 to check for run-of-the-mill vulnerabilities? There must be many millions sold. Quite handy for some intel agencies.

I assume any Wi-Fi camera under $150 has basically the same problems. I guess the only way to run a security camera where you don't have Ethernet is to use a non-proprietary Wi-Fi <-> 1000BASE-T adapter. Probably only something homebuilt based on a single board computer and running basically stock Linux/BSD meets that requirement.

Aurornis 12/19/2025||
> This is so bad that it must be intentional, right? Even though these are dirt cheap, they couldn't come up with $100,000 to check for run-of-the-mill vulnerabilities?

The camera sells for $17.99 on their website right now.

Subtract out the cost of the hardware, the box, warehousing, transit to the warehouse, assembly, testing, returns, lost shipments, warranty replacements, support staff, and everything else, then imagine how much is left over for profit. Let's be very optimistic and say $5 per unit.

That $5 per unit profit would mean an additional $100,000 invested in software development would be like taking 20,000 units of this camera and lighting them on fire. Or they could not do that and improve their bottom line numbers by $100,000.

TP-Link has a huge lineup of products and is constantly introducing new things. Multiply that $100,000 across the probably 100+ products on their websites and it becomes tens of millions of dollars per year.

The only way these ultra-cheap products are getting shipped at these prices is by doing the absolute bare minimum of software development. They take a reference design from the chip vendor, have 1 or 2 low wage engineers change things in the reference codebase until it appears to work, then they ship it.

heresie-dabord 12/20/2025|||
Both the parent and you can be right in this case.

The parent rightly suggested that there is the obvious intention to exploit these devices:

> This is so bad that it must be intentional, right? Even though these are dirt cheap, they couldn't come up with $100,000 to check for run-of-the-mill vulnerabilities?

You explained that there could be an economic reason for the appalling absence of security:

> The only way these ultra-cheap products are getting shipped at these prices is by doing the absolute bare minimum of software development.

But the parent's point is more convincing, based on the observable evidence and the very clear patterns of state-sponsored exploitation.

The vendors could set default passwords to be robust. The vendors could configure defaults to block upstream access. But maybe the vendors in this particular supply chain are more like the purveyors of shovels in a Gold Rush.

A less-charitable metaphor is possible where state-sponsored motives are unambiguously known.

reddalo 12/20/2025|||
Also, they stop releasing firmware updates for older hardware revisions. I bet older camera models have way more exploits.
tehlike 12/19/2025|||
Some cameras that "charge" with USB also can use a USB network adapter (provided they can supply power).

For the tech savvy, there is thingino as a firmware alternative - works local only, no cloud, and supports mqtt etc.

stragies 12/19/2025||
Is there a table of supported hardware, that contains info about the USB-connection (or ethernet) on these devices. Like, which have data-lines connected, can the device electrically do host and device mode? Can I use a POE2USBC adapter, that presents itself as a USB-network device to the camera? Ability to filter on those columns would be great. Is thingino using the Ingenic linux kernel 3.ancient SDK version, or do they have/use something newer?
cvhc 12/20/2025|||
It's been long known many older TP-Link IoT devices doesn't require any authentication to connect, as my Kasa HS300 strips. Later models requires the account credential [1], but I'm not surprised that they still left something wide open (e.g., WiFi config endpoint for provisioning). I tend to believe this is just poor software engineering (Hanlon's razor).

[1] https://www.home-assistant.io/integrations/tplink/

fylo 12/19/2025|||
Don't put them on untrusted networks. This always seemed obvious to me.
tehlike 12/19/2025|||
Untrusted network is not sufficient, you need to cut them off internet, in general.
baobun 12/19/2025||
The internet should very much be considered an untrusted network.
hdgvhicv 12/20/2025||
Don’t put it on a network, but also don’t allow it to reach an untrusted network.
aaronax 12/19/2025|||
My initial read of proximity being sufficient to exploit 3 is incorrect, so yeah as long as you control the Wi-Fi network sufficiently then things should be fine.
formerly_proven 12/19/2025||
> I assume any Wi-Fi camera has basically the same problems.

ftfy

tamimio 12/19/2025||
Great article. I have the same model and few months ago I did notice it was restarting in a non-scheduled time, and you can tell it restarts because it does a full rotation. First time it happened I ignored it but the second time I knew something was up so I disconnected it and since then been offline, it was recording an insignificant thing anyway.
VladVladikoff 12/19/2025||
>25000 devices exposed directly

How does this happen? Doesn’t pretty much every ISP give a router with their modem? How do people manage this?

hdgvhicv 12/20/2025|
In ipv4 these will be src-natted and thus have a statefuo firewall by necessity.

In IPv6 they likely will auto configure onto a public ip address which may not have a stateful firewall.

VladVladikoff 12/20/2025||
Doesn’t seem to be the case here all of these are ipv4 addresses https://www.zoomeye.ai/searchResult?q=IlRQUkktREVWSUNFIg==
burnt-resistor 12/21/2025||
For the home/lab, an second-hand enterprise network main switch and an OSS router like OPNsense to enforce security policies on the wired side of things. For WiFi gear, I've been a fan of Ubiquiti APs managed by a self-installed UniFi instance without cloud features. This, and some custom glue jobs/scripts on the unifi VM, make it easier to track down troublemakers and lock them down so they can't just dial-home or self-update and brick themselves.

PSA: Don't connect any TV used a dumb monitor to the internet. This is like connecting your toaster to the internet and begging for trouble.

tills13 12/20/2025|
I have a few of these that I use with unifi for non-critical things over ONVIF and there's a reason they are on a separate vlan and not allowed to access the internet... Thankfully they don't die when you block them from phoning home.
More comments...