dos.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. /* Copyright (c) 2018-2019, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. /*
  4. * \file dos.c
  5. * \brief Implement Denial of Service mitigation subsystem.
  6. */
  7. #define DOS_PRIVATE
  8. #include "core/or/or.h"
  9. #include "app/config/config.h"
  10. #include "core/mainloop/connection.h"
  11. #include "core/mainloop/mainloop.h"
  12. #include "core/or/channel.h"
  13. #include "core/or/connection_or.h"
  14. #include "core/or/relay.h"
  15. #include "feature/nodelist/networkstatus.h"
  16. #include "feature/nodelist/nodelist.h"
  17. #include "feature/relay/routermode.h"
  18. #include "feature/stats/geoip_stats.h"
  19. #include "lib/crypt_ops/crypto_rand.h"
  20. #include "core/or/dos.h"
  21. #include "core/or/or_connection_st.h"
  22. /*
  23. * Circuit creation denial of service mitigation.
  24. *
  25. * Namespace used for this mitigation framework is "dos_cc_" where "cc" is for
  26. * Circuit Creation.
  27. */
  28. /* Is the circuit creation DoS mitigation enabled? */
  29. static unsigned int dos_cc_enabled = 0;
  30. /* Consensus parameters. They can be changed when a new consensus arrives.
  31. * They are initialized with the hardcoded default values. */
  32. static uint32_t dos_cc_min_concurrent_conn;
  33. static uint32_t dos_cc_circuit_rate;
  34. static uint32_t dos_cc_circuit_burst;
  35. static dos_cc_defense_type_t dos_cc_defense_type;
  36. static int32_t dos_cc_defense_time_period;
  37. /* Keep some stats for the heartbeat so we can report out. */
  38. static uint64_t cc_num_rejected_cells;
  39. static uint32_t cc_num_marked_addrs;
  40. /*
  41. * Concurrent connection denial of service mitigation.
  42. *
  43. * Namespace used for this mitigation framework is "dos_conn_".
  44. */
  45. /* Is the connection DoS mitigation enabled? */
  46. static unsigned int dos_conn_enabled = 0;
  47. /* Consensus parameters. They can be changed when a new consensus arrives.
  48. * They are initialized with the hardcoded default values. */
  49. static uint32_t dos_conn_max_concurrent_count;
  50. static dos_conn_defense_type_t dos_conn_defense_type;
  51. /* Keep some stats for the heartbeat so we can report out. */
  52. static uint64_t conn_num_addr_rejected;
  53. /*
  54. * General interface of the denial of service mitigation subsystem.
  55. */
  56. /* Keep stats for the heartbeat. */
  57. static uint64_t num_single_hop_client_refused;
  58. /* Return true iff the circuit creation mitigation is enabled. We look at the
  59. * consensus for this else a default value is returned. */
  60. MOCK_IMPL(STATIC unsigned int,
  61. get_param_cc_enabled, (const networkstatus_t *ns))
  62. {
  63. if (get_options()->DoSCircuitCreationEnabled != -1) {
  64. return get_options()->DoSCircuitCreationEnabled;
  65. }
  66. return !!networkstatus_get_param(ns, "DoSCircuitCreationEnabled",
  67. DOS_CC_ENABLED_DEFAULT, 0, 1);
  68. }
  69. /* Return the parameter for the minimum concurrent connection at which we'll
  70. * start counting circuit for a specific client address. */
  71. STATIC uint32_t
  72. get_param_cc_min_concurrent_connection(const networkstatus_t *ns)
  73. {
  74. if (get_options()->DoSCircuitCreationMinConnections) {
  75. return get_options()->DoSCircuitCreationMinConnections;
  76. }
  77. return networkstatus_get_param(ns, "DoSCircuitCreationMinConnections",
  78. DOS_CC_MIN_CONCURRENT_CONN_DEFAULT,
  79. 1, INT32_MAX);
  80. }
  81. /* Return the parameter for the time rate that is how many circuits over this
  82. * time span. */
  83. static uint32_t
  84. get_param_cc_circuit_rate(const networkstatus_t *ns)
  85. {
  86. /* This is in seconds. */
  87. if (get_options()->DoSCircuitCreationRate) {
  88. return get_options()->DoSCircuitCreationRate;
  89. }
  90. return networkstatus_get_param(ns, "DoSCircuitCreationRate",
  91. DOS_CC_CIRCUIT_RATE_DEFAULT,
  92. 1, INT32_MAX);
  93. }
  94. /* Return the parameter for the maximum circuit count for the circuit time
  95. * rate. */
  96. STATIC uint32_t
  97. get_param_cc_circuit_burst(const networkstatus_t *ns)
  98. {
  99. if (get_options()->DoSCircuitCreationBurst) {
  100. return get_options()->DoSCircuitCreationBurst;
  101. }
  102. return networkstatus_get_param(ns, "DoSCircuitCreationBurst",
  103. DOS_CC_CIRCUIT_BURST_DEFAULT,
  104. 1, INT32_MAX);
  105. }
  106. /* Return the consensus parameter of the circuit creation defense type. */
  107. static uint32_t
  108. get_param_cc_defense_type(const networkstatus_t *ns)
  109. {
  110. if (get_options()->DoSCircuitCreationDefenseType) {
  111. return get_options()->DoSCircuitCreationDefenseType;
  112. }
  113. return networkstatus_get_param(ns, "DoSCircuitCreationDefenseType",
  114. DOS_CC_DEFENSE_TYPE_DEFAULT,
  115. DOS_CC_DEFENSE_NONE, DOS_CC_DEFENSE_MAX);
  116. }
  117. /* Return the consensus parameter of the defense time period which is how much
  118. * time should we defend against a malicious client address. */
  119. static int32_t
  120. get_param_cc_defense_time_period(const networkstatus_t *ns)
  121. {
  122. /* Time in seconds. */
  123. if (get_options()->DoSCircuitCreationDefenseTimePeriod) {
  124. return get_options()->DoSCircuitCreationDefenseTimePeriod;
  125. }
  126. return networkstatus_get_param(ns, "DoSCircuitCreationDefenseTimePeriod",
  127. DOS_CC_DEFENSE_TIME_PERIOD_DEFAULT,
  128. 0, INT32_MAX);
  129. }
  130. /* Return true iff connection mitigation is enabled. We look at the consensus
  131. * for this else a default value is returned. */
  132. MOCK_IMPL(STATIC unsigned int,
  133. get_param_conn_enabled, (const networkstatus_t *ns))
  134. {
  135. if (get_options()->DoSConnectionEnabled != -1) {
  136. return get_options()->DoSConnectionEnabled;
  137. }
  138. return !!networkstatus_get_param(ns, "DoSConnectionEnabled",
  139. DOS_CONN_ENABLED_DEFAULT, 0, 1);
  140. }
  141. /* Return the consensus parameter for the maximum concurrent connection
  142. * allowed. */
  143. STATIC uint32_t
  144. get_param_conn_max_concurrent_count(const networkstatus_t *ns)
  145. {
  146. if (get_options()->DoSConnectionMaxConcurrentCount) {
  147. return get_options()->DoSConnectionMaxConcurrentCount;
  148. }
  149. return networkstatus_get_param(ns, "DoSConnectionMaxConcurrentCount",
  150. DOS_CONN_MAX_CONCURRENT_COUNT_DEFAULT,
  151. 1, INT32_MAX);
  152. }
  153. /* Return the consensus parameter of the connection defense type. */
  154. static uint32_t
  155. get_param_conn_defense_type(const networkstatus_t *ns)
  156. {
  157. if (get_options()->DoSConnectionDefenseType) {
  158. return get_options()->DoSConnectionDefenseType;
  159. }
  160. return networkstatus_get_param(ns, "DoSConnectionDefenseType",
  161. DOS_CONN_DEFENSE_TYPE_DEFAULT,
  162. DOS_CONN_DEFENSE_NONE, DOS_CONN_DEFENSE_MAX);
  163. }
  164. /* Set circuit creation parameters located in the consensus or their default
  165. * if none are present. Called at initialization or when the consensus
  166. * changes. */
  167. static void
  168. set_dos_parameters(const networkstatus_t *ns)
  169. {
  170. /* Get the default consensus param values. */
  171. dos_cc_enabled = get_param_cc_enabled(ns);
  172. dos_cc_min_concurrent_conn = get_param_cc_min_concurrent_connection(ns);
  173. dos_cc_circuit_rate = get_param_cc_circuit_rate(ns);
  174. dos_cc_circuit_burst = get_param_cc_circuit_burst(ns);
  175. dos_cc_defense_time_period = get_param_cc_defense_time_period(ns);
  176. dos_cc_defense_type = get_param_cc_defense_type(ns);
  177. /* Connection detection. */
  178. dos_conn_enabled = get_param_conn_enabled(ns);
  179. dos_conn_max_concurrent_count = get_param_conn_max_concurrent_count(ns);
  180. dos_conn_defense_type = get_param_conn_defense_type(ns);
  181. }
  182. /* Free everything for the circuit creation DoS mitigation subsystem. */
  183. static void
  184. cc_free_all(void)
  185. {
  186. /* If everything is freed, the circuit creation subsystem is not enabled. */
  187. dos_cc_enabled = 0;
  188. }
  189. /* Called when the consensus has changed. Do appropriate actions for the
  190. * circuit creation subsystem. */
  191. static void
  192. cc_consensus_has_changed(const networkstatus_t *ns)
  193. {
  194. /* Looking at the consensus, is the circuit creation subsystem enabled? If
  195. * not and it was enabled before, clean it up. */
  196. if (dos_cc_enabled && !get_param_cc_enabled(ns)) {
  197. cc_free_all();
  198. }
  199. }
  200. /** Return the number of circuits we allow per second under the current
  201. * configuration. */
  202. STATIC uint64_t
  203. get_circuit_rate_per_second(void)
  204. {
  205. return dos_cc_circuit_rate;
  206. }
  207. /* Given the circuit creation client statistics object, refill the circuit
  208. * bucket if needed. This also works if the bucket was never filled in the
  209. * first place. The addr is only used for logging purposes. */
  210. STATIC void
  211. cc_stats_refill_bucket(cc_client_stats_t *stats, const tor_addr_t *addr)
  212. {
  213. uint32_t new_circuit_bucket_count;
  214. uint64_t num_token, elapsed_time_last_refill = 0, circuit_rate = 0;
  215. time_t now;
  216. int64_t last_refill_ts;
  217. tor_assert(stats);
  218. tor_assert(addr);
  219. now = approx_time();
  220. last_refill_ts = (int64_t)stats->last_circ_bucket_refill_ts;
  221. /* If less than a second has elapsed, don't add any tokens.
  222. * Note: If a relay's clock is ever 0, any new clients won't get a refill
  223. * until the next second. But a relay that thinks it is 1970 will never
  224. * validate the public consensus. */
  225. if ((int64_t)now == last_refill_ts) {
  226. goto done;
  227. }
  228. /* At this point, we know we might need to add token to the bucket. We'll
  229. * first get the circuit rate that is how many circuit are we allowed to do
  230. * per second. */
  231. circuit_rate = get_circuit_rate_per_second();
  232. /* We've never filled the bucket so fill it with the maximum being the burst
  233. * and we are done.
  234. * Note: If a relay's clock is ever 0, all clients that were last refilled
  235. * in that zero second will get a full refill here. */
  236. if (last_refill_ts == 0) {
  237. num_token = dos_cc_circuit_burst;
  238. goto end;
  239. }
  240. /* Our clock jumped backward so fill it up to the maximum. Not filling it
  241. * could trigger a detection for a valid client. Also, if the clock jumped
  242. * negative but we didn't notice until the elapsed time became positive
  243. * again, then we potentially spent many seconds not refilling the bucket
  244. * when we should have been refilling it. But the fact that we didn't notice
  245. * until now means that no circuit creation requests came in during that
  246. * time, so the client doesn't end up punished that much from this hopefully
  247. * rare situation.*/
  248. if ((int64_t)now < last_refill_ts) {
  249. /* Use the maximum allowed value of token. */
  250. num_token = dos_cc_circuit_burst;
  251. goto end;
  252. }
  253. /* How many seconds have elapsed between now and the last refill?
  254. * This subtraction can't underflow, because now >= last_refill_ts.
  255. * And it can't overflow, because INT64_MAX - (-INT64_MIN) == UINT64_MAX. */
  256. elapsed_time_last_refill = (uint64_t)now - last_refill_ts;
  257. /* If the elapsed time is very large, it means our clock jumped forward.
  258. * If the multiplication would overflow, use the maximum allowed value. */
  259. if (elapsed_time_last_refill > UINT32_MAX) {
  260. num_token = dos_cc_circuit_burst;
  261. goto end;
  262. }
  263. /* Compute how many circuits we are allowed in that time frame which we'll
  264. * add to the bucket. This can't overflow, because both multiplicands
  265. * are less than or equal to UINT32_MAX, and num_token is uint64_t. */
  266. num_token = elapsed_time_last_refill * circuit_rate;
  267. end:
  268. /* If the sum would overflow, use the maximum allowed value. */
  269. if (num_token > UINT32_MAX - stats->circuit_bucket) {
  270. new_circuit_bucket_count = dos_cc_circuit_burst;
  271. } else {
  272. /* We cap the bucket to the burst value else this could overflow uint32_t
  273. * over time. */
  274. new_circuit_bucket_count = MIN(stats->circuit_bucket + (uint32_t)num_token,
  275. dos_cc_circuit_burst);
  276. }
  277. /* This function is not allowed to make the bucket count larger than the
  278. * burst value */
  279. tor_assert_nonfatal(new_circuit_bucket_count <= dos_cc_circuit_burst);
  280. /* This function is not allowed to make the bucket count smaller, unless it
  281. * is decreasing it to a newly configured, lower burst value. We allow the
  282. * bucket to stay the same size, in case the circuit rate is zero. */
  283. tor_assert_nonfatal(new_circuit_bucket_count >= stats->circuit_bucket ||
  284. new_circuit_bucket_count == dos_cc_circuit_burst);
  285. log_debug(LD_DOS, "DoS address %s has its circuit bucket value: %" PRIu32
  286. ". Filling it to %" PRIu32 ". Circuit rate is %" PRIu64
  287. ". Elapsed time is %" PRIi64,
  288. fmt_addr(addr), stats->circuit_bucket, new_circuit_bucket_count,
  289. circuit_rate, (int64_t)elapsed_time_last_refill);
  290. stats->circuit_bucket = new_circuit_bucket_count;
  291. stats->last_circ_bucket_refill_ts = now;
  292. done:
  293. return;
  294. }
  295. /* Return true iff the circuit bucket is down to 0 and the number of
  296. * concurrent connections is greater or equal the minimum threshold set the
  297. * consensus parameter. */
  298. static int
  299. cc_has_exhausted_circuits(const dos_client_stats_t *stats)
  300. {
  301. tor_assert(stats);
  302. return stats->cc_stats.circuit_bucket == 0 &&
  303. stats->concurrent_count >= dos_cc_min_concurrent_conn;
  304. }
  305. /* Mark client address by setting a timestamp in the stats object which tells
  306. * us until when it is marked as positively detected. */
  307. static void
  308. cc_mark_client(cc_client_stats_t *stats)
  309. {
  310. tor_assert(stats);
  311. /* We add a random offset of a maximum of half the defense time so it is
  312. * less predictable. */
  313. stats->marked_until_ts =
  314. approx_time() + dos_cc_defense_time_period +
  315. crypto_rand_int_range(1, dos_cc_defense_time_period / 2);
  316. }
  317. /* Return true iff the given channel address is marked as malicious. This is
  318. * called a lot and part of the fast path of handling cells. It has to remain
  319. * as fast as we can. */
  320. static int
  321. cc_channel_addr_is_marked(channel_t *chan)
  322. {
  323. time_t now;
  324. tor_addr_t addr;
  325. clientmap_entry_t *entry;
  326. cc_client_stats_t *stats = NULL;
  327. if (chan == NULL) {
  328. goto end;
  329. }
  330. /* Must be a client connection else we ignore. */
  331. if (!channel_is_client(chan)) {
  332. goto end;
  333. }
  334. /* Without an IP address, nothing can work. */
  335. if (!channel_get_addr_if_possible(chan, &addr)) {
  336. goto end;
  337. }
  338. /* We are only interested in client connection from the geoip cache. */
  339. entry = geoip_lookup_client(&addr, NULL, GEOIP_CLIENT_CONNECT);
  340. if (entry == NULL) {
  341. /* We can have a connection creating circuits but not tracked by the geoip
  342. * cache. Once this DoS subsystem is enabled, we can end up here with no
  343. * entry for the channel. */
  344. goto end;
  345. }
  346. now = approx_time();
  347. stats = &entry->dos_stats.cc_stats;
  348. end:
  349. return stats && stats->marked_until_ts >= now;
  350. }
  351. /* Concurrent connection private API. */
  352. /* Free everything for the connection DoS mitigation subsystem. */
  353. static void
  354. conn_free_all(void)
  355. {
  356. dos_conn_enabled = 0;
  357. }
  358. /* Called when the consensus has changed. Do appropriate actions for the
  359. * connection mitigation subsystem. */
  360. static void
  361. conn_consensus_has_changed(const networkstatus_t *ns)
  362. {
  363. /* Looking at the consensus, is the connection mitigation subsystem enabled?
  364. * If not and it was enabled before, clean it up. */
  365. if (dos_conn_enabled && !get_param_conn_enabled(ns)) {
  366. conn_free_all();
  367. }
  368. }
  369. /* General private API */
  370. /* Return true iff we have at least one DoS detection enabled. This is used to
  371. * decide if we need to allocate any kind of high level DoS object. */
  372. static inline int
  373. dos_is_enabled(void)
  374. {
  375. return (dos_cc_enabled || dos_conn_enabled);
  376. }
  377. /* Circuit creation public API. */
  378. /* Called when a CREATE cell is received from the given channel. */
  379. void
  380. dos_cc_new_create_cell(channel_t *chan)
  381. {
  382. tor_addr_t addr;
  383. clientmap_entry_t *entry;
  384. tor_assert(chan);
  385. /* Skip everything if not enabled. */
  386. if (!dos_cc_enabled) {
  387. goto end;
  388. }
  389. /* Must be a client connection else we ignore. */
  390. if (!channel_is_client(chan)) {
  391. goto end;
  392. }
  393. /* Without an IP address, nothing can work. */
  394. if (!channel_get_addr_if_possible(chan, &addr)) {
  395. goto end;
  396. }
  397. /* We are only interested in client connection from the geoip cache. */
  398. entry = geoip_lookup_client(&addr, NULL, GEOIP_CLIENT_CONNECT);
  399. if (entry == NULL) {
  400. /* We can have a connection creating circuits but not tracked by the geoip
  401. * cache. Once this DoS subsystem is enabled, we can end up here with no
  402. * entry for the channel. */
  403. goto end;
  404. }
  405. /* General comment. Even though the client can already be marked as
  406. * malicious, we continue to track statistics. If it keeps going above
  407. * threshold while marked, the defense period time will grow longer. There
  408. * is really no point at unmarking a client that keeps DoSing us. */
  409. /* First of all, we'll try to refill the circuit bucket opportunistically
  410. * before we assess. */
  411. cc_stats_refill_bucket(&entry->dos_stats.cc_stats, &addr);
  412. /* Take a token out of the circuit bucket if we are above 0 so we don't
  413. * underflow the bucket. */
  414. if (entry->dos_stats.cc_stats.circuit_bucket > 0) {
  415. entry->dos_stats.cc_stats.circuit_bucket--;
  416. }
  417. /* This is the detection. Assess at every CREATE cell if the client should
  418. * get marked as malicious. This should be kept as fast as possible. */
  419. if (cc_has_exhausted_circuits(&entry->dos_stats)) {
  420. /* If this is the first time we mark this entry, log it a info level.
  421. * Under heavy DDoS, logging each time we mark would results in lots and
  422. * lots of logs. */
  423. if (entry->dos_stats.cc_stats.marked_until_ts == 0) {
  424. log_debug(LD_DOS, "Detected circuit creation DoS by address: %s",
  425. fmt_addr(&addr));
  426. cc_num_marked_addrs++;
  427. }
  428. cc_mark_client(&entry->dos_stats.cc_stats);
  429. }
  430. end:
  431. return;
  432. }
  433. /* Return the defense type that should be used for this circuit.
  434. *
  435. * This is part of the fast path and called a lot. */
  436. dos_cc_defense_type_t
  437. dos_cc_get_defense_type(channel_t *chan)
  438. {
  439. tor_assert(chan);
  440. /* Skip everything if not enabled. */
  441. if (!dos_cc_enabled) {
  442. goto end;
  443. }
  444. /* On an OR circuit, we'll check if the previous channel is a marked client
  445. * connection detected by our DoS circuit creation mitigation subsystem. */
  446. if (cc_channel_addr_is_marked(chan)) {
  447. /* We've just assess that this circuit should trigger a defense for the
  448. * cell it just seen. Note it down. */
  449. cc_num_rejected_cells++;
  450. return dos_cc_defense_type;
  451. }
  452. end:
  453. return DOS_CC_DEFENSE_NONE;
  454. }
  455. /* Concurrent connection detection public API. */
  456. /* Return true iff the given address is permitted to open another connection.
  457. * A defense value is returned for the caller to take appropriate actions. */
  458. dos_conn_defense_type_t
  459. dos_conn_addr_get_defense_type(const tor_addr_t *addr)
  460. {
  461. clientmap_entry_t *entry;
  462. tor_assert(addr);
  463. /* Skip everything if not enabled. */
  464. if (!dos_conn_enabled) {
  465. goto end;
  466. }
  467. /* We are only interested in client connection from the geoip cache. */
  468. entry = geoip_lookup_client(addr, NULL, GEOIP_CLIENT_CONNECT);
  469. if (entry == NULL) {
  470. goto end;
  471. }
  472. /* Need to be above the maximum concurrent connection count to trigger a
  473. * defense. */
  474. if (entry->dos_stats.concurrent_count > dos_conn_max_concurrent_count) {
  475. conn_num_addr_rejected++;
  476. return dos_conn_defense_type;
  477. }
  478. end:
  479. return DOS_CONN_DEFENSE_NONE;
  480. }
  481. /* General API */
  482. /* Take any appropriate actions for the given geoip entry that is about to get
  483. * freed. This is called for every entry that is being freed.
  484. *
  485. * This function will clear out the connection tracked flag if the concurrent
  486. * count of the entry is above 0 so if those connections end up being seen by
  487. * this subsystem, we won't try to decrement the counter for a new geoip entry
  488. * that might have been added after this call for the same address. */
  489. void
  490. dos_geoip_entry_about_to_free(const clientmap_entry_t *geoip_ent)
  491. {
  492. tor_assert(geoip_ent);
  493. /* The count is down to 0 meaning no connections right now, we can safely
  494. * clear the geoip entry from the cache. */
  495. if (geoip_ent->dos_stats.concurrent_count == 0) {
  496. goto end;
  497. }
  498. /* For each connection matching the geoip entry address, we'll clear the
  499. * tracked flag because the entry is about to get removed from the geoip
  500. * cache. We do not try to decrement if the flag is not set. */
  501. SMARTLIST_FOREACH_BEGIN(get_connection_array(), connection_t *, conn) {
  502. if (conn->type == CONN_TYPE_OR) {
  503. or_connection_t *or_conn = TO_OR_CONN(conn);
  504. if (!tor_addr_compare(&geoip_ent->addr, &or_conn->real_addr,
  505. CMP_EXACT)) {
  506. or_conn->tracked_for_dos_mitigation = 0;
  507. }
  508. }
  509. } SMARTLIST_FOREACH_END(conn);
  510. end:
  511. return;
  512. }
  513. /* Note down that we've just refused a single hop client. This increments a
  514. * counter later used for the heartbeat. */
  515. void
  516. dos_note_refuse_single_hop_client(void)
  517. {
  518. num_single_hop_client_refused++;
  519. }
  520. /* Return true iff single hop client connection (ESTABLISH_RENDEZVOUS) should
  521. * be refused. */
  522. int
  523. dos_should_refuse_single_hop_client(void)
  524. {
  525. /* If we aren't a public relay, this shouldn't apply to anything. */
  526. if (!public_server_mode(get_options())) {
  527. return 0;
  528. }
  529. if (get_options()->DoSRefuseSingleHopClientRendezvous != -1) {
  530. return get_options()->DoSRefuseSingleHopClientRendezvous;
  531. }
  532. return (int) networkstatus_get_param(NULL,
  533. "DoSRefuseSingleHopClientRendezvous",
  534. 0 /* default */, 0, 1);
  535. }
  536. /* Log a heartbeat message with some statistics. */
  537. void
  538. dos_log_heartbeat(void)
  539. {
  540. char *conn_msg = NULL;
  541. char *cc_msg = NULL;
  542. char *single_hop_client_msg = NULL;
  543. char *circ_stats_msg = NULL;
  544. /* Stats number coming from relay.c append_cell_to_circuit_queue(). */
  545. tor_asprintf(&circ_stats_msg,
  546. " %" PRIu64 " circuits killed with too many cells.",
  547. stats_n_circ_max_cell_reached);
  548. if (dos_cc_enabled) {
  549. tor_asprintf(&cc_msg,
  550. " %" PRIu64 " circuits rejected,"
  551. " %" PRIu32 " marked addresses.",
  552. cc_num_rejected_cells, cc_num_marked_addrs);
  553. }
  554. if (dos_conn_enabled) {
  555. tor_asprintf(&conn_msg,
  556. " %" PRIu64 " connections closed.",
  557. conn_num_addr_rejected);
  558. }
  559. if (dos_should_refuse_single_hop_client()) {
  560. tor_asprintf(&single_hop_client_msg,
  561. " %" PRIu64 " single hop clients refused.",
  562. num_single_hop_client_refused);
  563. }
  564. log_notice(LD_HEARTBEAT,
  565. "DoS mitigation since startup:%s%s%s%s",
  566. circ_stats_msg,
  567. (cc_msg != NULL) ? cc_msg : " [cc not enabled]",
  568. (conn_msg != NULL) ? conn_msg : " [conn not enabled]",
  569. (single_hop_client_msg != NULL) ? single_hop_client_msg : "");
  570. tor_free(conn_msg);
  571. tor_free(cc_msg);
  572. tor_free(single_hop_client_msg);
  573. tor_free(circ_stats_msg);
  574. return;
  575. }
  576. /* Called when a new client connection has been established on the given
  577. * address. */
  578. void
  579. dos_new_client_conn(or_connection_t *or_conn)
  580. {
  581. clientmap_entry_t *entry;
  582. tor_assert(or_conn);
  583. /* Past that point, we know we have at least one DoS detection subsystem
  584. * enabled so we'll start allocating stuff. */
  585. if (!dos_is_enabled()) {
  586. goto end;
  587. }
  588. /* We ignore any known address meaning an address of a known relay. The
  589. * reason to do so is because network reentry is possible where a client
  590. * connection comes from an Exit node. Even when we'll fix reentry, this is
  591. * a robust defense to keep in place. */
  592. if (nodelist_probably_contains_address(&or_conn->real_addr)) {
  593. goto end;
  594. }
  595. /* We are only interested in client connection from the geoip cache. */
  596. entry = geoip_lookup_client(&or_conn->real_addr, NULL,
  597. GEOIP_CLIENT_CONNECT);
  598. if (BUG(entry == NULL)) {
  599. /* Should never happen because we note down the address in the geoip
  600. * cache before this is called. */
  601. goto end;
  602. }
  603. entry->dos_stats.concurrent_count++;
  604. or_conn->tracked_for_dos_mitigation = 1;
  605. log_debug(LD_DOS, "Client address %s has now %u concurrent connections.",
  606. fmt_addr(&or_conn->real_addr),
  607. entry->dos_stats.concurrent_count);
  608. end:
  609. return;
  610. }
  611. /* Called when a client connection for the given IP address has been closed. */
  612. void
  613. dos_close_client_conn(const or_connection_t *or_conn)
  614. {
  615. clientmap_entry_t *entry;
  616. tor_assert(or_conn);
  617. /* We have to decrement the count on tracked connection only even if the
  618. * subsystem has been disabled at runtime because it might be re-enabled
  619. * after and we need to keep a synchronized counter at all time. */
  620. if (!or_conn->tracked_for_dos_mitigation) {
  621. goto end;
  622. }
  623. /* We are only interested in client connection from the geoip cache. */
  624. entry = geoip_lookup_client(&or_conn->real_addr, NULL,
  625. GEOIP_CLIENT_CONNECT);
  626. if (entry == NULL) {
  627. /* This can happen because we can close a connection before the channel
  628. * got to be noted down in the geoip cache. */
  629. goto end;
  630. }
  631. /* Extra super duper safety. Going below 0 means an underflow which could
  632. * lead to most likely a false positive. In theory, this should never happen
  633. * but lets be extra safe. */
  634. if (BUG(entry->dos_stats.concurrent_count == 0)) {
  635. goto end;
  636. }
  637. entry->dos_stats.concurrent_count--;
  638. log_debug(LD_DOS, "Client address %s has lost a connection. Concurrent "
  639. "connections are now at %u",
  640. fmt_addr(&or_conn->real_addr),
  641. entry->dos_stats.concurrent_count);
  642. end:
  643. return;
  644. }
  645. /* Called when the consensus has changed. We might have new consensus
  646. * parameters to look at. */
  647. void
  648. dos_consensus_has_changed(const networkstatus_t *ns)
  649. {
  650. /* There are two ways to configure this subsystem, one at startup through
  651. * dos_init() which is called when the options are parsed. And this one
  652. * through the consensus. We don't want to enable any DoS mitigation if we
  653. * aren't a public relay. */
  654. if (!public_server_mode(get_options())) {
  655. return;
  656. }
  657. cc_consensus_has_changed(ns);
  658. conn_consensus_has_changed(ns);
  659. /* We were already enabled or we just became enabled but either way, set the
  660. * consensus parameters for all subsystems. */
  661. set_dos_parameters(ns);
  662. }
  663. /* Return true iff the DoS mitigation subsystem is enabled. */
  664. int
  665. dos_enabled(void)
  666. {
  667. return dos_is_enabled();
  668. }
  669. /* Free everything from the Denial of Service subsystem. */
  670. void
  671. dos_free_all(void)
  672. {
  673. /* Free the circuit creation mitigation subsystem. It is safe to do this
  674. * even if it wasn't initialized. */
  675. cc_free_all();
  676. /* Free the connection mitigation subsystem. It is safe to do this even if
  677. * it wasn't initialized. */
  678. conn_free_all();
  679. }
  680. /* Initialize the Denial of Service subsystem. */
  681. void
  682. dos_init(void)
  683. {
  684. /* To initialize, we only need to get the parameters. */
  685. set_dos_parameters(NULL);
  686. }