WEBVTT 00:00:00.000 --> 00:00:19.150 36c3 preroll music 00:00:19.150 --> 00:00:25.910 Herald: The following talk of Fabian and Frederico will be about hacking NFC toys 00:00:25.910 --> 00:00:32.010 with a chameleon mini. Also, we have special guests here on stage! What is your 00:00:32.010 --> 00:00:34.010 name? Luna: Luna 00:00:34.010 --> 00:00:36.800 Herald: and Mila: Mila 00:00:36.800 --> 00:00:45.880 Herald: Give them a warm round of applause 00:00:45.880 --> 00:00:58.330 Fabian: Well, hello everyone! We have some nice little toy for kids. It's, ehm, it's 00:00:58.330 --> 00:01:05.031 a Tonie Box. You're putting a little figurine on top of that, and then the box 00:01:05.031 --> 00:01:15.380 starts playing a song or reads a story, and the tags are using NFC to authenticate 00:01:15.380 --> 00:01:24.140 themselves, more or less. And maybe luna will show how it is supposed to work. 00:01:24.140 --> 00:01:28.320 Luna, möchtest du das einmal vormachen? 00:01:28.320 --> 00:01:41.670 Music 00:01:41.670 --> 00:01:44.920 Fabian: Really good! Frederico: So, once you put in the the 00:01:44.920 --> 00:01:50.530 figurine, it plays, and stops, and it starts again with another one 00:01:50.530 --> 00:02:01.969 Fabian: Yes that's fine! We got the information from a forum where they just 00:02:01.969 --> 00:02:08.880 tried to hack these things and they stated that it was too difficult to do it with 00:02:08.880 --> 00:02:13.440 the chameleon mini, and that was like a challenge to us, since we are maintaining 00:02:13.440 --> 00:02:21.829 the github repository, which is open source, so we just did it yesterday and 00:02:21.829 --> 00:02:29.540 the kids can play with it today. We started by analyzing the communication by 00:02:29.540 --> 00:02:37.760 inputting a sniffer. We just received the communication from the box to the tag and 00:02:37.760 --> 00:02:42.800 we looked at it what is actually a incomprehensible authentication 00:02:42.800 --> 00:02:54.881 happening. What we see here is the log of the chameleon mini. This is ISO 15 693 and 00:02:54.881 --> 00:03:04.850 the marked up part is some proprietary commands. And from the forum, we knew that 00:03:04.850 --> 00:03:11.220 it is ICODE-Tags, so we just looked it up in the datasheet, and the command which we 00:03:11.220 --> 00:03:19.480 are seeing here is "get random number". So the tag responds with a 16… 16 bit random 00:03:19.480 --> 00:03:21.489 number… Frederico: …which is not shown here 00:03:21.489 --> 00:03:27.329 because, sorry, it's only one-side communication sniffing, so we have only 00:03:27.329 --> 00:03:32.350 the commands that are given to the target from the reader. So here we can see the 00:03:32.350 --> 00:03:37.180 random part of it, and we'll just deal with it later on, and we'll explain to you 00:03:37.180 --> 00:03:40.680 how we broke it nonetheless. 00:03:41.760 --> 00:03:46.340 Fabian: This is the normal ISO 15 00:03:46.340 --> 00:03:54.250 inventory command that selects a tag and expects the UID. But we are not 00:03:54.250 --> 00:04:02.079 authenticated right now so the tag goes on with the set password command. And that's 00:04:02.079 --> 00:04:11.530 quite interesting: It is a 32-bit password that is XORd with a random number. Twice. 00:04:11.530 --> 00:04:21.769 So no real crypto here. And then we see that we get selected, and here we see the 00:04:21.769 --> 00:04:30.300 UID of the tag. So we can work on that. We implemented the get random number command 00:04:30.300 --> 00:04:40.120 and the set password but we just did not send a random number back. So we just sent 00:04:40.120 --> 00:04:50.599 zeros and that's when we get the password. Then we emulated it, and let's take a look 00:04:50.599 --> 00:04:55.710 at the log again. Frederico: This is the full emulation log, 00:04:55.710 --> 00:05:00.900 so when I finally have both transmission and reception from the reader, so we are 00:05:00.900 --> 00:05:07.979 receiving data from the reader, and we are sending back transmission of – this is our 00:05:07.979 --> 00:05:12.860 this random number which is a zero zero zero zero. So we are sending all zeros. 00:05:12.860 --> 00:05:17.640 Then, it means that the password that will be sent by the reader to the tag will be 00:05:17.640 --> 00:05:24.139 XORd with only zeros. So, this is the authentication command, and you can see, 00:05:24.139 --> 00:05:30.189 now we have the password in plain text. Because they simply XORd it with the… with 00:05:30.189 --> 00:05:37.379 0. Now we finally have the password, so we can also use it to read the other tags. 00:05:37.379 --> 00:05:41.909 Because we actually need to authenticate in the right way, with proper tags. And we 00:05:41.909 --> 00:05:49.749 can read them and – if Mila… yeah… thanks Lula! It should be emulating a real target 00:05:49.749 --> 00:05:52.950 beeping from box Music playing 00:05:52.950 --> 00:05:58.610 Frederico: It's indeed emulating a real target. So once you have the password , 00:05:58.610 --> 00:06:03.919 you can authenticate, read the data from the from the tag, and reverse-engineer it. 00:06:03.919 --> 00:06:13.870 But actually, it's not even needed. Because somehow , the… the box is trusting 00:06:13.870 --> 00:06:19.120 the UID itself. So once you have emulation in place and you can read the UID from the 00:06:19.120 --> 00:06:25.120 sniffer we had before, you already good to go. You now have a perfect emulation and 00:06:25.120 --> 00:06:27.659 the kids can now play without incomprehensible toys 00:06:27.659 --> 00:06:33.430 Fabian: The interesting thing here is that we did not even start to read the tag, the 00:06:33.430 --> 00:06:39.710 actual data on the tag. As you see below here, we just sent back zeros and the tag 00:06:39.710 --> 00:06:45.199 still plays. So it doesn't even care what is written on the tag, they just 00:06:45.199 --> 00:06:55.060 check the UID once you put the tag on top of it and then you can just create a nice 00:06:55.060 --> 00:07:06.249 little backup. If the kids are breaking the toys or you exchange some figurines 00:07:06.249 --> 00:07:09.770 with your friends and… Frederico: No. No, that won't would be 00:07:09.770 --> 00:07:15.639 legal. Who would do that? Fabian: I won't do that, but Mila might! 00:07:15.639 --> 00:07:20.400 Frederico: We speculate that the data in the tag might be used to authenticate the 00:07:20.400 --> 00:07:29.159 first time with the box. Because once you buy a figurine it's linked to your account 00:07:29.159 --> 00:07:34.819 and probably it's… that they have decided it's used only the first time. So then 00:07:34.819 --> 00:07:40.200 later on, the Box just stores your UID and then it authenticates. And that's the 00:07:40.200 --> 00:07:44.439 reason why the Box does not care about the content, because it recognized the UID as 00:07:44.439 --> 00:07:49.719 one, it's already saved inside the thing. Fabian: Yes, and… but we did want to read 00:07:49.719 --> 00:07:57.290 the tag anyway. Actually we cannot do it with the Chameleon Mini right now, because 00:07:57.290 --> 00:08:03.289 there are some missing implementations. So we would like to join you to contribute 00:08:03.289 --> 00:08:12.090 something on our GitHub project. We quickly scripted something and I'm I'm… 00:08:12.090 --> 00:08:18.789 I'm going back… in Python for another reader, so we could read the tag and dump 00:08:18.789 --> 00:08:26.189 it. But we did not upload it to the Chameleon since we are already getting a 00:08:26.189 --> 00:08:30.460 full emulation on the tag. So we just save the time. 00:08:30.460 --> 00:08:37.190 Frederico: It will be on my gist for the time being I guess, because I need Python 00:08:37.190 --> 00:08:42.360 script to read those tags which are not totally supported by many readers now. You 00:08:42.360 --> 00:08:47.500 have to go to the bare commands. There is no read support really we made support for 00:08:47.500 --> 00:08:50.580 phones or something like that once the tag is in privacy mode. 00:08:50.580 --> 00:08:56.440 Fabian: Well, we are already finished Frederico: Yeah. We didn't have much to 00:08:56.440 --> 00:08:59.530 say I guess. Fabian: We'll just link the GitHub 00:08:59.530 --> 00:09:05.970 repository that's where you can also ask questions if you are playing with the 00:09:05.970 --> 00:09:12.210 chameleon and don't know how it works or getting stuck on something. We will be 00:09:12.210 --> 00:09:18.161 also here around for questions and answers, and if you want to buy a 00:09:18.161 --> 00:09:25.100 chameleon you still can do. You just have to find this man. 00:09:25.100 --> 00:09:30.070 Frederico: The yellow guy Fabian: At his parking spot which is up 00:09:30.070 --> 00:09:39.350 there, A2. Well I just found him, he's right in front of me. What a coincidence! 00:09:39.350 --> 00:09:42.220 And Frederico: That's it I guess. 00:09:42.220 --> 00:09:46.400 Fabian: That's it. 00:09:46.400 --> 00:09:54.410 Herald: Thank you Fabio and Frederico and especially thanks to Luna and Mila! We 00:09:54.410 --> 00:10:00.344 have time for some quick questions I think. Are there any questions? One 00:10:00.344 --> 00:10:04.907 question I see there. You were first. 00:10:08.357 --> 00:10:10.930 Q: From the point of what you know now, do 00:10:10.930 --> 00:10:16.780 you think it's possible that we have some kind of repository where I can download 00:10:16.780 --> 00:10:21.510 codes and play anything? A: Yeah, it's already available in my own 00:10:21.510 --> 00:10:25.910 fork of the repository, but we are probably gonna merge it in the main one. 00:10:25.910 --> 00:10:30.390 We will just tidy up the code and, it's a bit hacky. We will do a pull request and 00:10:30.390 --> 00:10:35.370 then we will merge it into the main GitHub repository, in a couple of days . But 00:10:35.370 --> 00:10:37.910 still, it's available as of now on my GitHub repository. 00:10:37.910 --> 00:10:46.430 Q: ok following question, on it there is a function I think that people can use this 00:10:46.430 --> 00:10:52.510 figures to record something, and this is saved in the cloud. Is, could this be a 00:10:52.510 --> 00:11:00.580 problem for privacy if I can technically clone other recordings from random people? 00:11:00.580 --> 00:11:05.240 Q2: Yes, if someone records his own stuff, like secret messages, you can 00:11:05.240 --> 00:11:07.240 download it. A: It depends. 00:11:07.240 --> 00:11:10.300 Q2: From my understanding yes, sorry A: He's the owner of the Box! 00:11:10.300 --> 00:11:14.660 Q2: From my understanding, yes, because you can upload your own, say, private 00:11:14.660 --> 00:11:20.550 discussion with your wife to one Tonie and since it's all, it goes through their 00:11:20.550 --> 00:11:26.050 cloud, and is stored on this box, if someone can copy my UID, very likely he 00:11:26.050 --> 00:11:30.550 can listen to what I was saying to my wife on this Tonie box. Yeah, this could be 00:11:30.550 --> 00:11:34.420 some privacy threat, while it's a bit far- fetched in the end of the day that's 00:11:34.420 --> 00:11:39.510 mostly children's music. A: Well it would be nice if, if you want 00:11:39.510 --> 00:11:45.370 to take a look at it, the code is online and you can do so and tell us! 00:11:45.370 --> 00:11:50.470 Q: Just a quick comment on that. As far as I know, you can like, if you have this 00:11:50.470 --> 00:11:56.290 Tonies where you can speak something on them, you can enable others to take your 00:11:56.290 --> 00:12:00.430 figurine and put it on their Tonie box, so you can enable this function or you can 00:12:00.430 --> 00:12:06.140 disable it. So even if you, as far as I know, even if you cloned this UID, you 00:12:06.140 --> 00:12:10.610 cannot necessarily put it on some other Tonie box and listen to this private ones 00:12:10.610 --> 00:12:15.300 at least. The other ones that would be possible but the private ones, the ones 00:12:15.300 --> 00:12:20.570 where you can put some music or some speech on, these you can disable the 00:12:20.570 --> 00:12:23.390 function to share them. That's what I know. 00:12:23.390 --> 00:12:29.740 A: Thanks H: So, any more questions? One more 00:12:29.740 --> 00:12:36.610 question or comment? Q: I was just wondering since now many 00:12:36.610 --> 00:12:40.880 kids will start going with the Chameleons through the supermarket – which is 00:12:40.880 --> 00:12:45.760 illegal! But most kids are too young to be prosecuted, no? And then they would steal 00:12:45.760 --> 00:12:51.160 several UIDs and, or maybe exchange them with friends, I was wondering, where do we 00:12:51.160 --> 00:12:57.110 collect the archive of valid UIDs and what the content is, say with which I'm using 00:12:57.110 --> 00:13:01.480 A: I'm not hosting it. I'm not hosting it. Q: Oh you are only into backups, into say 00:13:01.480 --> 00:13:04.950 a privacy backup A: Well, er, we have a little… – strict 00:13:04.950 --> 00:13:10.350 backup only! – comment within our source code that we know which UID belongs to 00:13:10.350 --> 00:13:17.430 which tag we worked with, but we will not expand it. 00:13:17.430 --> 00:13:22.000 Q: Okay so thank you, we have to collect it somewhere, the criminal stuff. Thank 00:13:22.000 --> 00:13:24.000 you! A: On your servers, [name]! 00:13:24.000 --> 00:13:26.840 36c3 postroll music 00:13:26.840 --> 00:13:51.820 Subtitles created by c3subtitles.de in the year 2021. Join, and help us!