Skip to content

Commit 13b8cc0

Browse files
author
Me No Dev
committed
Add sanity check so we do not trigger an update from wrong data
1 parent 14bb946 commit 13b8cc0

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

libraries/ArduinoOTA/ArduinoOTA.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
//#define OTA_DEBUG 1
88

9+
#define U_AUTH 200
10+
911
ArduinoOTAClass::ArduinoOTAClass()
1012
{
1113
_udp_ota = new WiFiUDP();
@@ -169,12 +171,17 @@ void ArduinoOTAClass::handle() {
169171
if (!_udp_ota->parsePacket()) return;
170172

171173
if(_state == OTA_IDLE){
174+
int cmd = _udp_ota->parseInt();
175+
if(cmd != U_FLASH && cmd != U_SPIFFS)
176+
return;
172177
_ota_ip = _udp_ota->remoteIP();
173-
_cmd = _udp_ota->parseInt();
178+
_cmd = cmd;
174179
_ota_port = _udp_ota->parseInt();
175180
_size = _udp_ota->parseInt();
176181
_udp_ota->read();
177182
sprintf(_md5, "%s", _udp_ota->readStringUntil('\n').c_str());
183+
if(strlen(_md5) != 32)
184+
return;
178185

179186
#if OTA_DEBUG
180187
Serial.print("Update Start: ip:");
@@ -199,8 +206,18 @@ void ArduinoOTAClass::handle() {
199206
_state = OTA_RUNUPDATE;
200207
}
201208
} else if(_state == OTA_WAITAUTH){
209+
int cmd = _udp_ota->parseInt();
210+
if(cmd != U_AUTH){
211+
_state = OTA_IDLE;
212+
return;
213+
}
214+
_udp_ota->read();
202215
String cnonce = _udp_ota->readStringUntil(' ');
203216
String response = _udp_ota->readStringUntil('\n');
217+
if(cnonce.length() != 32 || response.length() != 32){
218+
_state = OTA_IDLE;
219+
return;
220+
}
204221

205222
MD5Builder _passmd5;
206223
_passmd5.begin();

tools/espota.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
# Commands
3535
FLASH = 0
3636
SPIFFS = 100
37+
AUTH = 200
3738

3839

3940
def serve(remoteAddr, remotePort, password, filename, command = FLASH):
@@ -78,7 +79,7 @@ def serve(remoteAddr, remotePort, password, filename, command = FLASH):
7879
result = hashlib.md5(result_text).hexdigest()
7980
sys.stderr.write('Authenticating...')
8081
sys.stderr.flush()
81-
message = '%s %s\n' % (cnonce, result)
82+
message = '%d %s %s\n' % (AUTH, cnonce, result)
8283
sock2.sendto(message, remote_address)
8384
sock2.settimeout(10)
8485
try:

0 commit comments

Comments
 (0)