r11469@Kushana: nickm | 2006-12-07 15:11:04 -0500

Round stored/transmitted values for bandwidth usage.  This might make some attacks work less well.  This might well be voodoo, but it gives me a warm fuzzy feeling.


svn:r9048
This commit is contained in:
Nick Mathewson 2006-12-07 20:11:36 +00:00
parent 7c79495137
commit b4a90ca8a3
3 changed files with 14 additions and 8 deletions

View File

@ -23,6 +23,8 @@ Changes in version 0.1.2.5-xxxx - 200?-??-??
- Clients do not store bandwidth history in their state files. (This - Clients do not store bandwidth history in their state files. (This
shouldn't be an exploitable security issue, but it's better to be shouldn't be an exploitable security issue, but it's better to be
safe.) safe.)
- When generating bandwidth history, round down to the nearest 1k. When
storing accounting data, round up to the nearest 1k.
o Controller bugfixes: o Controller bugfixes:
- Report the circuit number correctly in STREAM CLOSED events. (Bug - Report the circuit number correctly in STREAM CLOSED events. (Bug

View File

@ -530,6 +530,7 @@ accounting_set_wakeup_time(void)
} }
} }
#define ROUND_UP(x) (((x) + 0x3ff) & ~0x3ff)
#define BW_ACCOUNTING_VERSION 1 #define BW_ACCOUNTING_VERSION 1
/** Save all our bandwidth tracking information to disk. Return 0 on /** Save all our bandwidth tracking information to disk. Return 0 on
* success, -1 on failure. */ * success, -1 on failure. */
@ -561,8 +562,8 @@ accounting_record_bandwidth_usage(time_t now, or_state_t *state)
BW_ACCOUNTING_VERSION, BW_ACCOUNTING_VERSION,
time1, time1,
time2, time2,
U64_PRINTF_ARG(n_bytes_read_in_interval), U64_PRINTF_ARG(ROUND_UP(n_bytes_read_in_interval)),
U64_PRINTF_ARG(n_bytes_written_in_interval), U64_PRINTF_ARG(ROUND_UP(n_bytes_written_in_interval)),
(unsigned long)n_seconds_active_in_interval, (unsigned long)n_seconds_active_in_interval,
(unsigned long)expected_bandwidth_usage); (unsigned long)expected_bandwidth_usage);
tor_snprintf(fname, sizeof(fname), "%s/bw_accounting", tor_snprintf(fname, sizeof(fname), "%s/bw_accounting",
@ -571,14 +572,16 @@ accounting_record_bandwidth_usage(time_t now, or_state_t *state)
/* Now update the state */ /* Now update the state */
state->AccountingIntervalStart = interval_start_time; state->AccountingIntervalStart = interval_start_time;
state->AccountingBytesReadInInterval = n_bytes_read_in_interval; state->AccountingBytesReadInInterval = ROUND_UP(n_bytes_read_in_interval);
state->AccountingBytesWrittenInInterval = n_bytes_written_in_interval; state->AccountingBytesWrittenInInterval =
ROUND_UP(n_bytes_written_in_interval);
state->AccountingSecondsActive = n_seconds_active_in_interval; state->AccountingSecondsActive = n_seconds_active_in_interval;
state->AccountingExpectedUsage = expected_bandwidth_usage; state->AccountingExpectedUsage = expected_bandwidth_usage;
or_state_mark_dirty(state, 60); or_state_mark_dirty(state, 60);
return r; return r;
} }
#undef ROUND_UP
/** Read stored accounting information from disk. Return 0 on success; /** Read stored accounting information from disk. Return 0 on success;
* return -1 and change nothing on failure. */ * return -1 and change nothing on failure. */

View File

@ -596,13 +596,14 @@ rep_hist_fill_bandwidth_history(char *buf, size_t len, bw_array_t *b)
} }
for (n=0; n<b->num_maxes_set; ++n,++i) { for (n=0; n<b->num_maxes_set; ++n,++i) {
uint64_t total;
while (i >= NUM_TOTALS) i -= NUM_TOTALS; while (i >= NUM_TOTALS) i -= NUM_TOTALS;
/* Round the bandwidth used down to the nearest 1k. */
total = b->totals[i] & ~0x3ff;
if (n==(b->num_maxes_set-1)) if (n==(b->num_maxes_set-1))
tor_snprintf(cp, len-(cp-buf), U64_FORMAT, tor_snprintf(cp, len-(cp-buf), U64_FORMAT, U64_PRINTF_ARG(total));
U64_PRINTF_ARG(b->totals[i]));
else else
tor_snprintf(cp, len-(cp-buf), U64_FORMAT",", tor_snprintf(cp, len-(cp-buf), U64_FORMAT",", U64_PRINTF_ARG(total));
U64_PRINTF_ARG(b->totals[i]));
cp += strlen(cp); cp += strlen(cp);
} }
return cp-buf; return cp-buf;